Compare commits
125 Commits
v2.32.0
...
eduvia-sso
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63de2c1800 | ||
|
|
3161cc29de | ||
|
|
d3f3737ff5 | ||
|
|
597648db08 | ||
|
|
16afb24276 | ||
|
|
cf5cc19fd5 | ||
|
|
80f093958a | ||
|
|
57df376207 | ||
|
|
a147aca24f | ||
|
|
1660f69930 | ||
|
|
718657f493 | ||
|
|
9a77b716a1 | ||
|
|
6e3c624b91 | ||
|
|
2271eb270e | ||
|
|
7e5b2e4e79 | ||
|
|
36076068ec | ||
|
|
c868354b5b | ||
|
|
db91f0b2a0 | ||
|
|
d7e83bb78e | ||
|
|
feb2a39e05 | ||
|
|
a6cf910d05 | ||
|
|
b891b44ac6 | ||
|
|
026a3ebb81 | ||
|
|
71ba246011 | ||
|
|
a391204fa6 | ||
|
|
9c773399a8 | ||
|
|
528b85352a | ||
|
|
249c369c14 | ||
|
|
9803fc1031 | ||
|
|
299fde1c98 | ||
|
|
7f55734fbb | ||
|
|
efe230865a | ||
|
|
6e52e684c8 | ||
|
|
99d880297a | ||
|
|
dec706ae72 | ||
|
|
2e60f0a0c2 | ||
|
|
ef612f86e5 | ||
|
|
9c16e03ea7 | ||
|
|
7780c0310e | ||
|
|
b0a23c0d1a | ||
|
|
05c85cea08 | ||
|
|
1ffae0a1de | ||
|
|
15cbccd15f | ||
|
|
266b2f2ac8 | ||
|
|
26f9fb4199 | ||
|
|
67887fb6ef | ||
|
|
3d102e39ff | ||
|
|
ddd9089130 | ||
|
|
d8ce88ab57 | ||
|
|
01794a47c6 | ||
|
|
17626dbbdb | ||
|
|
e5bd86658d | ||
|
|
e911dc1353 | ||
|
|
27e3e5aa6a | ||
|
|
5b65525bf1 | ||
|
|
277804f8b1 | ||
|
|
4c77802e3c | ||
|
|
aacfea6ea5 | ||
|
|
6d55040e43 | ||
|
|
290f785a47 | ||
|
|
39ef187f6b | ||
|
|
a7a475e763 | ||
|
|
6eb380ea38 | ||
|
|
4d150cb323 | ||
|
|
09d6d99b14 | ||
|
|
5e7fd8baff | ||
|
|
52c159e2e8 | ||
|
|
67e8feb879 | ||
|
|
a5b61d5244 | ||
|
|
decc3a16ed | ||
|
|
7f39e9f0cc | ||
|
|
95afa1a6ad | ||
|
|
0d0bb5f9e2 | ||
|
|
3dd5ce5035 | ||
|
|
549e56d551 | ||
|
|
50b6215d1e | ||
|
|
ff69bfdce7 | ||
|
|
c04cc8ec0f | ||
|
|
f324de2254 | ||
|
|
40af4e6f34 | ||
|
|
5d9b66b5cb | ||
|
|
d2a8277c13 | ||
|
|
ada85fc0f3 | ||
|
|
505345eff7 | ||
|
|
2911ade880 | ||
|
|
8980dc8f9c | ||
|
|
d94a1c47c0 | ||
|
|
99c3e5182d | ||
|
|
70e39fee40 | ||
|
|
26d6bec8a0 | ||
|
|
c9ac1a1402 | ||
|
|
6949c1092c | ||
|
|
aae8a54481 | ||
|
|
e1d93bf670 | ||
|
|
fea0533cb1 | ||
|
|
5cd991f02a | ||
|
|
50a8a605d5 | ||
|
|
9ce7d8f5d6 | ||
|
|
eae2587e4c | ||
|
|
323097f201 | ||
|
|
014499888a | ||
|
|
5662de21ae | ||
|
|
17c2eba455 | ||
|
|
1f2c986e8f | ||
|
|
12040b5f6d | ||
|
|
20a985848f | ||
|
|
c06c6169e5 | ||
|
|
917aeb79ef | ||
|
|
c4f36a39fe | ||
|
|
befedc30ad | ||
|
|
d3bc67daa2 | ||
|
|
5d7e211367 | ||
|
|
fa9daa01ec | ||
|
|
0ed9dc63b8 | ||
|
|
5dd6b33eb2 | ||
|
|
1210b823c7 | ||
|
|
04240b4b3d | ||
|
|
787f592a1a | ||
|
|
e7363fbd40 | ||
|
|
e2762825e5 | ||
|
|
bbbca70c71 | ||
|
|
8dde423866 | ||
|
|
fc4c1c2b7e | ||
|
|
bf02e2de3f | ||
|
|
a26ba4dc6e |
2
.github/workflows/make_release_pr.yml
vendored
2
.github/workflows/make_release_pr.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
name: Create weekly release
|
name: Create weekly release
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '30 4 15 * *'
|
- cron: '30 3 * * 3'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|||||||
6
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
6
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="HtmlUnknownBooleanAttribute" enabled="true" level="INFORMATION" enabled_by_default="true" editorAttributes="INFORMATION_ATTRIBUTES" />
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
7
.idea/misc.xml
generated
Normal file
7
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="Black">
|
||||||
|
<option name="sdkName" value="Python 3.11 (env)" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_24" project-jdk-name="Python 3.11 (env)" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
||||||
9
.idea/modules.xml
generated
Normal file
9
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/frontend/frontend.iml" filepath="$PROJECT_DIR$/frontend/frontend.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/lms/lms.iml" filepath="$PROJECT_DIR$/lms/lms.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
265
.idea/workspace.xml
generated
Normal file
265
.idea/workspace.xml
generated
Normal file
@@ -0,0 +1,265 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AutoImportSettings">
|
||||||
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
|
</component>
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="8ceac89e-548b-4898-a7d0-cd9692210a67" name="Changes" comment="">
|
||||||
|
<change beforePath="$PROJECT_DIR$/frontend/vite.config.js" beforeDir="false" afterPath="$PROJECT_DIR$/frontend/vite.config.js" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/ar.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/ar.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/bs.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/bs.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/cs.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/cs.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/de.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/de.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/eo.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/eo.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/es.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/es.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/fa.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/fa.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/fr.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/fr.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/hr.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/hr.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/hu.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/hu.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/id.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/id.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/it.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/it.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/main.pot" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/main.pot" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/nl.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/nl.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/pl.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/pl.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/pt.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/pt.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/pt_BR.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/pt_BR.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/ru.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/ru.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/sr.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/sr.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/sr_CS.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/sr_CS.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/sv.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/sv.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/th.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/th.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/tr.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/tr.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/vi.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/vi.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/lms/locale/zh.po" beforeDir="false" afterPath="$PROJECT_DIR$/lms/locale/zh.po" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
|
||||||
|
</list>
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="ComposerSettings">
|
||||||
|
<execution />
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="GitHubPullRequestSearchHistory">{
|
||||||
|
"lastFilter": {
|
||||||
|
"state": "OPEN",
|
||||||
|
"assignee": "stanig2106"
|
||||||
|
}
|
||||||
|
}</component>
|
||||||
|
<component name="GithubPullRequestsUISettings">{
|
||||||
|
"selectedUrlAndAccountId": {
|
||||||
|
"url": "https://github.com/eduvia-app/lms",
|
||||||
|
"accountId": "07629746-0347-4709-8dfa-2d0f080158cf"
|
||||||
|
}
|
||||||
|
}</component>
|
||||||
|
<component name="KubernetesApiPersistence">{}</component>
|
||||||
|
<component name="KubernetesApiProvider">{
|
||||||
|
"isMigrated": true
|
||||||
|
}</component>
|
||||||
|
<component name="MacroExpansionManager">
|
||||||
|
<option name="directoryName" value="zkk5YL6F" />
|
||||||
|
</component>
|
||||||
|
<component name="PhpWorkspaceProjectConfiguration" interpreter_name="/opt/homebrew/Cellar/php/8.3.7/bin/php" />
|
||||||
|
<component name="ProjectColorInfo">{
|
||||||
|
"associatedIndex": 3
|
||||||
|
}</component>
|
||||||
|
<component name="ProjectId" id="31EuJyp79zrs7MLT76Y4wgzYgGe" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
<option name="showMembers" value="true" />
|
||||||
|
<option name="showVisibilityIcons" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"ModuleVcsDetector.initialDetectionPerformed": "true",
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"RunOnceActivity.git.unshallow": "true",
|
||||||
|
"RunOnceActivity.go.formatter.settings.were.checked": "true",
|
||||||
|
"RunOnceActivity.go.migrated.go.modules.settings": "true",
|
||||||
|
"dart.analysis.tool.window.visible": "false",
|
||||||
|
"git-widget-placeholder": "eduvia/prod",
|
||||||
|
"go.import.settings.migrated": "true",
|
||||||
|
"junie.onboarding.icon.badge.shown": "true",
|
||||||
|
"node.js.detected.package.eslint": "true",
|
||||||
|
"node.js.detected.package.tslint": "true",
|
||||||
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
|
"nodejs_package_manager_path": "yarn",
|
||||||
|
"org.rust.cargo.project.model.impl.CargoExternalSystemProjectAware.subscribe.first.balloon": "",
|
||||||
|
"org.rust.first.attach.projects": "true",
|
||||||
|
"project.structure.last.edited": "Modules",
|
||||||
|
"project.structure.proportion": "0.15",
|
||||||
|
"project.structure.side.proportion": "0.2",
|
||||||
|
"settings.editor.selected.configurable": "application.passwordSafe",
|
||||||
|
"to.speed.mode.migration.done": "true",
|
||||||
|
"ts.external.directory.path": "/Users/stani/Documents/campus-prive/frappe-bench/apps/lms/frontend/node_modules/typescript/lib",
|
||||||
|
"vue.rearranger.settings.migration": "true"
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="RubyModuleManagerSettings">
|
||||||
|
<option name="blackListedRootsPaths">
|
||||||
|
<list>
|
||||||
|
<option value="$PROJECT_DIR$/lms" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="RunManager">
|
||||||
|
<configuration default="true" type="GoApplicationRunConfiguration" factoryName="Go Application">
|
||||||
|
<module name="lms" />
|
||||||
|
<working_directory value="$PROJECT_DIR$" />
|
||||||
|
<go_parameters value="-i" />
|
||||||
|
<kind />
|
||||||
|
<directory value="$PROJECT_DIR$" />
|
||||||
|
<filePath value="$PROJECT_DIR$" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="GoTestRunConfiguration" factoryName="Go Test">
|
||||||
|
<module name="lms" />
|
||||||
|
<working_directory value="$PROJECT_DIR$" />
|
||||||
|
<go_parameters value="-i" />
|
||||||
|
<kind />
|
||||||
|
<directory value="$PROJECT_DIR$" />
|
||||||
|
<filePath value="$PROJECT_DIR$" />
|
||||||
|
<framework value="gotest" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="JetRunConfigurationType">
|
||||||
|
<module name="lms" />
|
||||||
|
<method v="2">
|
||||||
|
<option name="Make" enabled="true" />
|
||||||
|
</method>
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="KotlinStandaloneScriptRunConfigurationType">
|
||||||
|
<option name="filePath" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="PythonConfigurationType" factoryName="Python">
|
||||||
|
<module name="lms" />
|
||||||
|
<option name="ENV_FILES" value="" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="PARENT_ENVS" value="true" />
|
||||||
|
<envs>
|
||||||
|
<env name="PYTHONUNBUFFERED" value="1" />
|
||||||
|
</envs>
|
||||||
|
<option name="SDK_HOME" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="" />
|
||||||
|
<option name="IS_MODULE_SDK" value="false" />
|
||||||
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
|
<option name="SCRIPT_NAME" value="" />
|
||||||
|
<option name="PARAMETERS" value="" />
|
||||||
|
<option name="SHOW_COMMAND_LINE" value="false" />
|
||||||
|
<option name="EMULATE_TERMINAL" value="false" />
|
||||||
|
<option name="MODULE_MODE" value="false" />
|
||||||
|
<option name="REDIRECT_INPUT" value="false" />
|
||||||
|
<option name="INPUT_FILE" value="" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="Python.FlaskServer">
|
||||||
|
<option name="ENV_FILES" value="" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="PARENT_ENVS" value="true" />
|
||||||
|
<option name="SDK_HOME" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="" />
|
||||||
|
<option name="IS_MODULE_SDK" value="false" />
|
||||||
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
|
<module name="" />
|
||||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
|
<option name="launchJavascriptDebuger" value="false" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="Tox" factoryName="Tox">
|
||||||
|
<option name="ENV_FILES" value="" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="PARENT_ENVS" value="true" />
|
||||||
|
<option name="SDK_HOME" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="" />
|
||||||
|
<option name="IS_MODULE_SDK" value="false" />
|
||||||
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="tests" factoryName="Autodetect">
|
||||||
|
<module name="lms" />
|
||||||
|
<option name="ENV_FILES" value="" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="PARENT_ENVS" value="true" />
|
||||||
|
<option name="SDK_HOME" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="" />
|
||||||
|
<option name="IS_MODULE_SDK" value="false" />
|
||||||
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
|
<option name="_new_additionalArguments" value="""" />
|
||||||
|
<option name="_new_target" value="""" />
|
||||||
|
<option name="_new_targetType" value=""PATH"" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
<configuration default="true" type="tests" factoryName="Doctests">
|
||||||
|
<module name="lms" />
|
||||||
|
<option name="ENV_FILES" value="" />
|
||||||
|
<option name="INTERPRETER_OPTIONS" value="" />
|
||||||
|
<option name="PARENT_ENVS" value="true" />
|
||||||
|
<option name="SDK_HOME" value="" />
|
||||||
|
<option name="WORKING_DIRECTORY" value="" />
|
||||||
|
<option name="IS_MODULE_SDK" value="false" />
|
||||||
|
<option name="ADD_CONTENT_ROOTS" value="true" />
|
||||||
|
<option name="ADD_SOURCE_ROOTS" value="true" />
|
||||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
||||||
|
<option name="SCRIPT_NAME" value="" />
|
||||||
|
<option name="CLASS_NAME" value="" />
|
||||||
|
<option name="METHOD_NAME" value="" />
|
||||||
|
<option name="FOLDER_NAME" value="" />
|
||||||
|
<option name="TEST_TYPE" value="TEST_SCRIPT" />
|
||||||
|
<option name="PATTERN" value="" />
|
||||||
|
<option name="USE_PATTERN" value="false" />
|
||||||
|
<method v="2" />
|
||||||
|
</configuration>
|
||||||
|
</component>
|
||||||
|
<component name="RustProjectSettings">
|
||||||
|
<option name="toolchainHomeDirectory" value="$USER_HOME$/.cargo/bin" />
|
||||||
|
</component>
|
||||||
|
<component name="SharedIndexes">
|
||||||
|
<attachedChunks>
|
||||||
|
<set>
|
||||||
|
<option value="bundled-js-predefined-d6986cc7102b-b26f3e71634d-JavaScript-IU-251.26094.121" />
|
||||||
|
</set>
|
||||||
|
</attachedChunks>
|
||||||
|
</component>
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="8ceac89e-548b-4898-a7d0-cd9692210a67" name="Changes" comment="" />
|
||||||
|
<created>1755101486887</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1755101486887</updated>
|
||||||
|
<workItem from="1755101488483" duration="947000" />
|
||||||
|
<workItem from="1755102648895" duration="6458000" />
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
|
<option name="version" value="3" />
|
||||||
|
</component>
|
||||||
|
<component name="Vcs.Log.Tabs.Properties">
|
||||||
|
<option name="TAB_STATES">
|
||||||
|
<map>
|
||||||
|
<entry key="MAIN">
|
||||||
|
<value>
|
||||||
|
<State />
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="VgoProject">
|
||||||
|
<settings-migrated>true</settings-migrated>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@@ -107,7 +107,7 @@ describe("Course Creation", () => {
|
|||||||
cy.get("div").contains(
|
cy.get("div").contains(
|
||||||
"Test Course Short Introduction to test the UI"
|
"Test Course Short Introduction to test the UI"
|
||||||
);
|
);
|
||||||
cy.get(".course-image")
|
cy.get(".bg-cover")
|
||||||
.invoke("css", "background-image")
|
.invoke("css", "background-image")
|
||||||
.should("include", "/files/profile");
|
.should("include", "/files/profile");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -18,12 +18,12 @@ services:
|
|||||||
|
|
||||||
frappe:
|
frappe:
|
||||||
image: frappe/bench:latest
|
image: frappe/bench:latest
|
||||||
command: bash /workspace/init.sh
|
command: bash /workspace/docker/init.sh
|
||||||
environment:
|
environment:
|
||||||
- SHELL=/bin/bash
|
- SHELL=/bin/bash
|
||||||
working_dir: /home/frappe
|
working_dir: /home/frappe
|
||||||
volumes:
|
volumes:
|
||||||
- .:/workspace
|
- ..:/workspace
|
||||||
ports:
|
ports:
|
||||||
- 8000:8000
|
- 8000:8000
|
||||||
- 9000:9000
|
- 9000:9000
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [ -d "/home/frappe/frappe-bench/apps/frappe" ]; then
|
if [ -d "/home/frappe/frappe-bench/apps/frappe" ]; then
|
||||||
echo "Bench already exists, skipping init"
|
echo "Bench already exists, skipping init"
|
||||||
@@ -37,4 +37,10 @@ bench --site lms.localhost set-config developer_mode 1
|
|||||||
bench --site lms.localhost clear-cache
|
bench --site lms.localhost clear-cache
|
||||||
bench use lms.localhost
|
bench use lms.localhost
|
||||||
|
|
||||||
|
# Import French translations from workspace (persisted in repo)
|
||||||
|
if [ -f "/workspace/lms/translations/fr.csv" ]; then
|
||||||
|
bench --site lms.localhost import-translations fr /workspace/lms/translations/fr.csv || true
|
||||||
|
bench --site lms.localhost clear-cache
|
||||||
|
fi
|
||||||
|
|
||||||
bench start
|
bench start
|
||||||
|
|||||||
Submodule frappe-ui updated: fd5252663b...80d3a010ac
1
frontend/components.d.ts
vendored
1
frontend/components.d.ts
vendored
@@ -40,6 +40,7 @@ declare module 'vue' {
|
|||||||
Code: typeof import('./src/components/Controls/Code.vue')['default']
|
Code: typeof import('./src/components/Controls/Code.vue')['default']
|
||||||
CodeEditor: typeof import('./src/components/Controls/CodeEditor.vue')['default']
|
CodeEditor: typeof import('./src/components/Controls/CodeEditor.vue')['default']
|
||||||
CollapseSidebar: typeof import('./src/components/Icons/CollapseSidebar.vue')['default']
|
CollapseSidebar: typeof import('./src/components/Icons/CollapseSidebar.vue')['default']
|
||||||
|
ColorSwatches: typeof import('./src/components/Controls/ColorSwatches.vue')['default']
|
||||||
CourseCard: typeof import('./src/components/CourseCard.vue')['default']
|
CourseCard: typeof import('./src/components/CourseCard.vue')['default']
|
||||||
CourseCardOverlay: typeof import('./src/components/CourseCardOverlay.vue')['default']
|
CourseCardOverlay: typeof import('./src/components/CourseCardOverlay.vue')['default']
|
||||||
CourseInstructors: typeof import('./src/components/CourseInstructors.vue')['default']
|
CourseInstructors: typeof import('./src/components/CourseInstructors.vue')['default']
|
||||||
|
|||||||
9
frontend/frontend.iml
Normal file
9
frontend/frontend.iml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
"codemirror": "^6.0.1",
|
"codemirror": "^6.0.1",
|
||||||
"dayjs": "^1.11.6",
|
"dayjs": "^1.11.6",
|
||||||
"feather-icons": "^4.28.0",
|
"feather-icons": "^4.28.0",
|
||||||
"frappe-ui": "^0.1.163",
|
"frappe-ui": "^0.1.172",
|
||||||
"highlight.js": "^11.11.1",
|
"highlight.js": "^11.11.1",
|
||||||
"lucide-vue-next": "^0.383.0",
|
"lucide-vue-next": "^0.383.0",
|
||||||
"markdown-it": "^14.0.0",
|
"markdown-it": "^14.0.0",
|
||||||
|
|||||||
@@ -157,7 +157,7 @@
|
|||||||
v-model="showHelpModal"
|
v-model="showHelpModal"
|
||||||
v-model:articles="articles"
|
v-model:articles="articles"
|
||||||
appName="learning"
|
appName="learning"
|
||||||
title="Frappe Learning"
|
:title="__('Frappe Learning')"
|
||||||
:logo="LMSLogo"
|
:logo="LMSLogo"
|
||||||
:afterSkip="(step) => capture('onboarding_step_skipped_' + step)"
|
:afterSkip="(step) => capture('onboarding_step_skipped_' + step)"
|
||||||
:afterSkipAll="() => capture('onboarding_steps_skipped')"
|
:afterSkipAll="() => capture('onboarding_steps_skipped')"
|
||||||
@@ -303,7 +303,7 @@ const unreadNotifications = createResource({
|
|||||||
const addNotifications = () => {
|
const addNotifications = () => {
|
||||||
if (user) {
|
if (user) {
|
||||||
sidebarLinks.value.push({
|
sidebarLinks.value.push({
|
||||||
label: 'Notifications',
|
label: __('Notifications'),
|
||||||
icon: 'Bell',
|
icon: 'Bell',
|
||||||
to: 'Notifications',
|
to: 'Notifications',
|
||||||
activeFor: ['Notifications'],
|
activeFor: ['Notifications'],
|
||||||
@@ -315,7 +315,7 @@ const addNotifications = () => {
|
|||||||
const addQuizzes = () => {
|
const addQuizzes = () => {
|
||||||
if (isInstructor.value || isModerator.value) {
|
if (isInstructor.value || isModerator.value) {
|
||||||
sidebarLinks.value.splice(4, 0, {
|
sidebarLinks.value.splice(4, 0, {
|
||||||
label: 'Quizzes',
|
label: __('Quizzes'),
|
||||||
icon: 'CircleHelp',
|
icon: 'CircleHelp',
|
||||||
to: 'Quizzes',
|
to: 'Quizzes',
|
||||||
activeFor: [
|
activeFor: [
|
||||||
@@ -331,7 +331,7 @@ const addQuizzes = () => {
|
|||||||
const addAssignments = () => {
|
const addAssignments = () => {
|
||||||
if (isInstructor.value || isModerator.value) {
|
if (isInstructor.value || isModerator.value) {
|
||||||
sidebarLinks.value.splice(5, 0, {
|
sidebarLinks.value.splice(5, 0, {
|
||||||
label: 'Assignments',
|
label: __('Assignments'),
|
||||||
icon: 'Pencil',
|
icon: 'Pencil',
|
||||||
to: 'Assignments',
|
to: 'Assignments',
|
||||||
activeFor: [
|
activeFor: [
|
||||||
@@ -344,6 +344,22 @@ const addAssignments = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const addProgrammingExercises = () => {
|
||||||
|
if (isInstructor.value || isModerator.value) {
|
||||||
|
sidebarLinks.value.splice(3, 0, {
|
||||||
|
label: __('Programming Exercises'),
|
||||||
|
icon: 'Code',
|
||||||
|
to: 'ProgrammingExercises',
|
||||||
|
activeFor: [
|
||||||
|
'ProgrammingExercises',
|
||||||
|
'ProgrammingExerciseForm',
|
||||||
|
'ProgrammingExerciseSubmissions',
|
||||||
|
'ProgrammingExerciseSubmission',
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const addPrograms = () => {
|
const addPrograms = () => {
|
||||||
let activeFor = ['Programs', 'ProgramForm']
|
let activeFor = ['Programs', 'ProgramForm']
|
||||||
let index = 1
|
let index = 1
|
||||||
@@ -367,7 +383,7 @@ const addPrograms = () => {
|
|||||||
|
|
||||||
if (canAddProgram) {
|
if (canAddProgram) {
|
||||||
sidebarLinks.value.splice(index, 0, {
|
sidebarLinks.value.splice(index, 0, {
|
||||||
label: 'Programs',
|
label: __('Programs'),
|
||||||
icon: 'Route',
|
icon: 'Route',
|
||||||
to: 'Programs',
|
to: 'Programs',
|
||||||
activeFor: activeFor,
|
activeFor: activeFor,
|
||||||
@@ -627,6 +643,7 @@ watch(userResource, () => {
|
|||||||
isModerator.value = userResource.data.is_moderator
|
isModerator.value = userResource.data.is_moderator
|
||||||
isInstructor.value = userResource.data.is_instructor
|
isInstructor.value = userResource.data.is_instructor
|
||||||
addPrograms()
|
addPrograms()
|
||||||
|
addProgrammingExercises()
|
||||||
addQuizzes()
|
addQuizzes()
|
||||||
addAssignments()
|
addAssignments()
|
||||||
setUpOnboarding()
|
setUpOnboarding()
|
||||||
|
|||||||
@@ -208,12 +208,12 @@ const canAddAssessments = () => {
|
|||||||
const getAssessmentColumns = () => {
|
const getAssessmentColumns = () => {
|
||||||
let columns = [
|
let columns = [
|
||||||
{
|
{
|
||||||
label: 'Assessment',
|
label: __('Assessment'),
|
||||||
key: 'title',
|
key: 'title',
|
||||||
width: '25rem',
|
width: '25rem',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Type',
|
label: __('Type'),
|
||||||
key: 'assessment_type',
|
key: 'assessment_type',
|
||||||
width: '15rem',
|
width: '15rem',
|
||||||
},
|
},
|
||||||
@@ -221,7 +221,7 @@ const getAssessmentColumns = () => {
|
|||||||
|
|
||||||
if (!user.data?.is_moderator) {
|
if (!user.data?.is_moderator) {
|
||||||
columns.push({
|
columns.push({
|
||||||
label: 'Status/Percentage',
|
label: __('Status/Percentage'),
|
||||||
key: 'status',
|
key: 'status',
|
||||||
align: 'left',
|
align: 'left',
|
||||||
width: '10rem',
|
width: '10rem',
|
||||||
|
|||||||
@@ -453,9 +453,9 @@ const canModifyAssignment = computed(() => {
|
|||||||
|
|
||||||
const submissionStatusOptions = computed(() => {
|
const submissionStatusOptions = computed(() => {
|
||||||
return [
|
return [
|
||||||
{ label: 'Not Graded', value: 'Not Graded' },
|
{ label: __('Not Graded'), value: 'Not Graded' },
|
||||||
{ label: 'Pass', value: 'Pass' },
|
{ label: __('Pass'), value: 'Pass' },
|
||||||
{ label: 'Fail', value: 'Fail' },
|
{ label: __('Fail'), value: 'Fail' },
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -116,17 +116,17 @@ const openCourseModal = () => {
|
|||||||
const getCoursesColumns = () => {
|
const getCoursesColumns = () => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'Title',
|
label: __('Title'),
|
||||||
key: 'title',
|
key: 'title',
|
||||||
width: 2,
|
width: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Lessons',
|
label: __('Lessons'),
|
||||||
key: 'lessons',
|
key: 'lessons',
|
||||||
align: 'right',
|
align: 'right',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Enrollments',
|
label: __('Enrollments'),
|
||||||
align: 'right',
|
align: 'right',
|
||||||
key: 'enrollments',
|
key: 'enrollments',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -231,19 +231,19 @@ const students = createResource({
|
|||||||
const getStudentColumns = () => {
|
const getStudentColumns = () => {
|
||||||
let columns = [
|
let columns = [
|
||||||
{
|
{
|
||||||
label: 'Full Name',
|
label: __('Full Name'),
|
||||||
key: 'full_name',
|
key: 'full_name',
|
||||||
width: '20rem',
|
width: '20rem',
|
||||||
icon: 'user',
|
icon: 'user',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Progress',
|
label: __('Progress'),
|
||||||
key: 'progress',
|
key: 'progress',
|
||||||
width: '15rem',
|
width: '15rem',
|
||||||
icon: 'activity',
|
icon: 'activity',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Last Active',
|
label: __('Last Active'),
|
||||||
key: 'last_active',
|
key: 'last_active',
|
||||||
width: '10rem',
|
width: '10rem',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
"
|
"
|
||||||
:value="query"
|
:value="query"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="Search"
|
:placeholder="__('Search')"
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
class="absolute right-1.5 inline-flex h-7 w-7 items-center justify-center"
|
class="absolute right-1.5 inline-flex h-7 w-7 items-center justify-center"
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
v-if="groups.length == 0"
|
v-if="groups.length == 0"
|
||||||
class="mt-1.5 rounded-md px-2.5 py-1.5 text-base text-ink-gray-5"
|
class="mt-1.5 rounded-md px-2.5 py-1.5 text-base text-ink-gray-5"
|
||||||
>
|
>
|
||||||
No results found
|
{{ __('No results found') }}
|
||||||
</li>
|
</li>
|
||||||
</ComboboxOptions>
|
</ComboboxOptions>
|
||||||
<div v-if="slots.footer" class="border-t p-1.5 pb-0.5">
|
<div v-if="slots.footer" class="border-t p-1.5 pb-0.5">
|
||||||
|
|||||||
108
frontend/src/components/Controls/ColorSwatches.vue
Normal file
108
frontend/src/components/Controls/ColorSwatches.vue
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="text-xs text-ink-gray-5 mb-1">
|
||||||
|
{{ __(label) }}
|
||||||
|
</div>
|
||||||
|
<Popover placement="bottom" class="!block">
|
||||||
|
<template #target="{ togglePopover, isOpen }">
|
||||||
|
<div class="space-y-2">
|
||||||
|
<FormControl
|
||||||
|
type="text"
|
||||||
|
autocomplete="off"
|
||||||
|
class="w-full"
|
||||||
|
:placeholder="__('Set Color')"
|
||||||
|
@focus="togglePopover"
|
||||||
|
:modelValue="modelValue"
|
||||||
|
@update:modelValue="(val: string) => emit('update:modelValue', val)"
|
||||||
|
>
|
||||||
|
<template #prefix>
|
||||||
|
<div
|
||||||
|
class="size-4 rounded-full"
|
||||||
|
:style="
|
||||||
|
modelValue
|
||||||
|
? {
|
||||||
|
backgroundColor:
|
||||||
|
theme.backgroundColor[modelValue.toLowerCase()][400],
|
||||||
|
}
|
||||||
|
: {}
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<Palette
|
||||||
|
v-if="!modelValue"
|
||||||
|
class="size-4 stroke-1.5 text-ink-gray-5"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #suffix>
|
||||||
|
<Button variant="ghost">
|
||||||
|
<X
|
||||||
|
class="size-3 text-ink-gray-5"
|
||||||
|
@click="emit('update:modelValue', null)"
|
||||||
|
/>
|
||||||
|
</Button>
|
||||||
|
</template>
|
||||||
|
</FormControl>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #body="{ close }">
|
||||||
|
<div class="rounded-lg bg-surface-white p-3 border w-fit mt-2">
|
||||||
|
<div class="text-xs text-ink-gray-5 mb-1.5">
|
||||||
|
{{ __('Swatches') }}
|
||||||
|
</div>
|
||||||
|
<div class="grid grid-cols-7 gap-2">
|
||||||
|
<div
|
||||||
|
v-for="color in colors"
|
||||||
|
:key="color"
|
||||||
|
class="size-5 rounded-full cursor-pointer"
|
||||||
|
:style="{
|
||||||
|
backgroundColor:
|
||||||
|
theme.backgroundColor[color.toLowerCase()][400],
|
||||||
|
}"
|
||||||
|
@click="
|
||||||
|
(e) => {
|
||||||
|
emit('update:modelValue', color)
|
||||||
|
close()
|
||||||
|
emit('change', color)
|
||||||
|
}
|
||||||
|
"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</Popover>
|
||||||
|
<div class="text-sm text-ink-gray-5 mt-2">
|
||||||
|
{{ description }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { Button, FormControl, Popover } from 'frappe-ui'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
import { Palette, X } from 'lucide-vue-next'
|
||||||
|
import { theme } from '@/utils/theme'
|
||||||
|
|
||||||
|
const emit = defineEmits(['update:modelValue', 'change'])
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
modelValue: string
|
||||||
|
label: string
|
||||||
|
description?: string
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const colors = computed(() => {
|
||||||
|
return [
|
||||||
|
'Red',
|
||||||
|
'Blue',
|
||||||
|
'Green',
|
||||||
|
'Amber',
|
||||||
|
'Purple',
|
||||||
|
'Cyan',
|
||||||
|
'Orange',
|
||||||
|
'Violet',
|
||||||
|
'Pink',
|
||||||
|
'Teal',
|
||||||
|
'Gray',
|
||||||
|
'Yellow',
|
||||||
|
]
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@@ -1,41 +1,51 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
v-if="course.title"
|
v-if="course.title"
|
||||||
class="flex flex-col h-full rounded-md border-2 overflow-auto"
|
class="flex flex-col h-full rounded-md border-2 overflow-auto text-ink-gray-9"
|
||||||
style="min-height: 350px"
|
style="min-height: 350px"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="course-image"
|
class="w-[100%] h-[168px] bg-cover bg-center bg-no-repeat"
|
||||||
:class="{ 'default-image': !course.image }"
|
:style="
|
||||||
:style="{ backgroundImage: 'url(\'' + encodeURI(course.image) + '\')' }"
|
course.image
|
||||||
|
? { backgroundImage: `url('${encodeURI(course.image)}')` }
|
||||||
|
: {
|
||||||
|
backgroundImage: getGradientColor(),
|
||||||
|
backgroundBlendMode: 'screen',
|
||||||
|
}
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<div class="flex items-center flex-wrap relative top-4 px-2 w-fit">
|
<div class="flex items-center flex-wrap relative top-4 px-2 w-fit">
|
||||||
<Badge
|
<div
|
||||||
v-if="course.featured"
|
v-if="course.featured"
|
||||||
variant="subtle"
|
class="flex items-center space-x-1 text-xs text-ink-amber-3 bg-surface-white border border-outline-amber-1 px-2 py-0.5 rounded-md mr-1 mb-1"
|
||||||
theme="green"
|
|
||||||
size="md"
|
|
||||||
class="mb-1 mr-1"
|
|
||||||
>
|
>
|
||||||
{{ __('Featured') }}
|
<Star class="size-3 stroke-2" />
|
||||||
</Badge>
|
<span>
|
||||||
|
{{ __('Featured') }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="course.tags"
|
v-if="course.tags"
|
||||||
v-for="tag in course.tags?.split(', ')"
|
v-for="tag in course.tags?.split(', ')"
|
||||||
class="text-xs bg-white text-gray-800 px-2 py-0.5 rounded-md mb-1 mr-1"
|
class="text-xs border bg-surface-white text-ink-gray-9 px-2 py-0.5 rounded-md mb-1 mr-1"
|
||||||
>
|
>
|
||||||
{{ tag }}
|
{{ tag }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!course.image" class="image-placeholder">
|
<div
|
||||||
{{ course.title[0] }}
|
v-if="!course.image"
|
||||||
|
class="flex items-center justify-center text-white flex-1 font-extrabold text-2xl my-auto px-5 text-center leading-6"
|
||||||
|
:class="course.tags ? 'h-[80%]' : 'h-full'"
|
||||||
|
>
|
||||||
|
{{ course.title }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-col flex-auto p-4">
|
<div class="flex flex-col flex-auto p-4">
|
||||||
<div class="flex items-center justify-between mb-2">
|
<div class="flex items-center justify-between mb-2">
|
||||||
<div v-if="course.lessons">
|
<div v-if="course.lessons">
|
||||||
<Tooltip :text="__('Lessons')">
|
<Tooltip :text="__('Lessons')">
|
||||||
<span class="flex items-center text-ink-gray-7">
|
<span class="flex items-center">
|
||||||
<BookOpen class="h-4 w-4 stroke-1.5 mr-1" />
|
<BookOpen class="h-4 w-4 stroke-1.5 mr-1" />
|
||||||
{{ course.lessons }}
|
{{ course.lessons }}
|
||||||
</span>
|
</span>
|
||||||
@@ -44,8 +54,8 @@
|
|||||||
|
|
||||||
<div v-if="course.enrollments">
|
<div v-if="course.enrollments">
|
||||||
<Tooltip :text="__('Enrolled Students')">
|
<Tooltip :text="__('Enrolled Students')">
|
||||||
<span class="flex items-center text-ink-gray-7">
|
<span class="flex items-center">
|
||||||
<Users class="h-4 w-4 stroke-1. mr-1" />
|
<Users class="h-4 w-4 stroke-1.5 mr-1" />
|
||||||
{{ course.enrollments }}
|
{{ course.enrollments }}
|
||||||
</span>
|
</span>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
@@ -53,14 +63,14 @@
|
|||||||
|
|
||||||
<div v-if="course.rating">
|
<div v-if="course.rating">
|
||||||
<Tooltip :text="__('Average Rating')">
|
<Tooltip :text="__('Average Rating')">
|
||||||
<span class="flex items-center text-ink-gray-7">
|
<span class="flex items-center">
|
||||||
<Star class="h-4 w-4 stroke-1.5 mr-1" />
|
<Star class="h-4 w-4 stroke-1.5 mr-1" />
|
||||||
{{ course.rating }}
|
{{ course.rating }}
|
||||||
</span>
|
</span>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="course.status != 'Approved'">
|
<!-- <div v-if="course.status != 'Approved'">
|
||||||
<Badge
|
<Badge
|
||||||
variant="subtle"
|
variant="subtle"
|
||||||
:theme="course.status === 'Under Review' ? 'orange' : 'blue'"
|
:theme="course.status === 'Under Review' ? 'orange' : 'blue'"
|
||||||
@@ -68,14 +78,14 @@
|
|||||||
>
|
>
|
||||||
{{ course.status }}
|
{{ course.status }}
|
||||||
</Badge>
|
</Badge>
|
||||||
</div>
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="text-xl font-semibold leading-6 text-ink-gray-9">
|
<div v-if="course.image" class="text-xl font-semibold leading-6">
|
||||||
{{ course.title }}
|
{{ course.title }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="short-introduction text-ink-gray-7 text-sm">
|
<div class="short-introduction text-sm">
|
||||||
{{ course.short_introduction }}
|
{{ course.short_introduction }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -84,11 +94,8 @@
|
|||||||
:progress="course.membership.progress"
|
:progress="course.membership.progress"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div
|
<div v-if="user && course.membership" class="text-sm mt-2 mb-4">
|
||||||
v-if="user && course.membership"
|
{{ Math.ceil(course.membership.progress) }}% {{ __('completed') }}
|
||||||
class="text-sm text-ink-gray-7 mt-2 mb-4"
|
|
||||||
>
|
|
||||||
{{ Math.ceil(course.membership.progress) }}% completed
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center justify-between mt-auto">
|
<div class="flex items-center justify-between mt-auto">
|
||||||
@@ -108,21 +115,23 @@
|
|||||||
<div v-if="course.paid_course" class="font-semibold">
|
<div v-if="course.paid_course" class="font-semibold">
|
||||||
{{ course.price }}
|
{{ course.price }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
|
||||||
|
<Tooltip
|
||||||
v-if="course.paid_certificate || course.enable_certification"
|
v-if="course.paid_certificate || course.enable_certification"
|
||||||
class="text-xs text-ink-blue-3 bg-surface-blue-1 py-0.5 px-1 rounded-md"
|
:text="__('Get Certified')"
|
||||||
>
|
>
|
||||||
{{ __('Certification') }}
|
<GraduationCap class="size-5 stroke-1.5 text-ink-gray-7" />
|
||||||
</div>
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { BookOpen, Users, Star } from 'lucide-vue-next'
|
import { BookOpen, GraduationCap, Star, Users } from 'lucide-vue-next'
|
||||||
import UserAvatar from '@/components/UserAvatar.vue'
|
import UserAvatar from '@/components/UserAvatar.vue'
|
||||||
import { sessionStore } from '@/stores/session'
|
import { sessionStore } from '@/stores/session'
|
||||||
import { Badge, Tooltip } from 'frappe-ui'
|
import { Tooltip } from 'frappe-ui'
|
||||||
|
import { theme } from '@/utils/theme'
|
||||||
import CourseInstructors from '@/components/CourseInstructors.vue'
|
import CourseInstructors from '@/components/CourseInstructors.vue'
|
||||||
import ProgressBar from '@/components/ProgressBar.vue'
|
import ProgressBar from '@/components/ProgressBar.vue'
|
||||||
|
|
||||||
@@ -134,16 +143,24 @@ const props = defineProps({
|
|||||||
default: null,
|
default: null,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getGradientColor = () => {
|
||||||
|
let color = props.course.card_gradient?.toLowerCase() || 'blue'
|
||||||
|
let colorMap = theme.backgroundColor[color]
|
||||||
|
return `linear-gradient(to top right, black, ${colorMap[400]})`
|
||||||
|
/* return `bg-gradient-to-br from-${color}-100 via-${color}-200 to-${color}-400` */
|
||||||
|
/* return `linear-gradient(to bottom right, ${colorMap[100]}, ${colorMap[400]})` */
|
||||||
|
/* return `radial-gradient(ellipse at 80% 20%, black 20%, ${colorMap[500]} 100%)` */
|
||||||
|
/* return `radial-gradient(ellipse at 30% 70%, black 50%, ${colorMap[500]} 100%)` */
|
||||||
|
/* return `radial-gradient(ellipse at 80% 20%, ${colorMap[100]} 0%, ${colorMap[300]} 50%, ${colorMap[500]} 100%)` */
|
||||||
|
/* return `conic-gradient(from 180deg at 50% 50%, ${colorMap[100]} 0%, ${colorMap[200]} 50%, ${colorMap[400]} 100%)` */
|
||||||
|
/* return `linear-gradient(135deg, ${colorMap[100]}, ${colorMap[300]}), linear-gradient(120deg, rgba(255,255,255,0.4) 0%, transparent 60%) ` */
|
||||||
|
/* return `radial-gradient(circle at 20% 30%, ${colorMap[100]} 0%, transparent 40%),
|
||||||
|
radial-gradient(circle at 80% 40%, ${colorMap[200]} 0%, transparent 50%),
|
||||||
|
linear-gradient(135deg, ${colorMap[300]} 0%, ${colorMap[400]} 100%);` */
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
.course-image {
|
|
||||||
height: 168px;
|
|
||||||
width: 100%;
|
|
||||||
background-size: cover;
|
|
||||||
background-position: center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.course-card-pills {
|
.course-card-pills {
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
@@ -157,14 +174,6 @@ const props = defineProps({
|
|||||||
width: fit-content;
|
width: fit-content;
|
||||||
}
|
}
|
||||||
|
|
||||||
.default-image {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
background-color: theme('colors.green.100');
|
|
||||||
color: theme('colors.green.600');
|
|
||||||
}
|
|
||||||
|
|
||||||
.avatar-group {
|
.avatar-group {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -173,14 +182,7 @@ const props = defineProps({
|
|||||||
.avatar-group .avatar {
|
.avatar-group .avatar {
|
||||||
transition: margin 0.1s ease-in-out;
|
transition: margin 0.1s ease-in-out;
|
||||||
}
|
}
|
||||||
.image-placeholder {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
flex: 1;
|
|
||||||
font-size: 5rem;
|
|
||||||
color: theme('colors.gray.700');
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
.avatar-group.overlap .avatar + .avatar {
|
.avatar-group.overlap .avatar + .avatar {
|
||||||
margin-left: calc(-8px);
|
margin-left: calc(-8px);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="text-ink-gray-7">
|
<div class="">
|
||||||
<span v-if="instructors?.length == 1">
|
<span v-if="instructors?.length == 1">
|
||||||
<router-link
|
<router-link
|
||||||
:to="{
|
:to="{
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
>
|
>
|
||||||
{{ instructors[0].first_name }}
|
{{ instructors[0].first_name }}
|
||||||
</router-link>
|
</router-link>
|
||||||
and
|
{{ __('and') }}
|
||||||
<router-link
|
<router-link
|
||||||
:to="{
|
:to="{
|
||||||
name: 'Profile',
|
name: 'Profile',
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
>
|
>
|
||||||
{{ instructors[0].first_name }}
|
{{ instructors[0].first_name }}
|
||||||
</router-link>
|
</router-link>
|
||||||
and {{ instructors?.length - 1 }} others
|
{{ __('and') }} {{ instructors?.length - 1 }} {{ __('others') }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -32,13 +32,13 @@
|
|||||||
"
|
"
|
||||||
:options="[
|
:options="[
|
||||||
{
|
{
|
||||||
label: 'Edit',
|
label: __('Edit'),
|
||||||
onClick() {
|
onClick() {
|
||||||
reply.editable = true
|
reply.editable = true
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Delete',
|
label: __('Delete'),
|
||||||
onClick() {
|
onClick() {
|
||||||
deleteReply(reply)
|
deleteReply(reply)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
emptyStateText: {
|
emptyStateText: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'Start a discussion',
|
default: __('Start a discussion'),
|
||||||
},
|
},
|
||||||
singleThread: {
|
singleThread: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
|||||||
@@ -2,23 +2,26 @@
|
|||||||
<div class="flex flex-col items-center justify-center mt-60">
|
<div class="flex flex-col items-center justify-center mt-60">
|
||||||
<GraduationCap class="size-10 mx-auto stroke-1 text-ink-gray-5" />
|
<GraduationCap class="size-10 mx-auto stroke-1 text-ink-gray-5" />
|
||||||
<div class="text-lg font-semibold text-ink-gray-7 mb-2.5">
|
<div class="text-lg font-semibold text-ink-gray-7 mb-2.5">
|
||||||
{{ __('No {0}').format(type?.toLowerCase()) }}
|
|
||||||
|
{{ __('No {0}').format(props.type) }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="leading-5 text-base w-2/5 text-base text-center text-ink-gray-7"
|
class="leading-5 text-base w-2/5 text-base text-center text-ink-gray-7"
|
||||||
>
|
>
|
||||||
{{
|
{{
|
||||||
__(
|
__(
|
||||||
'There are no {0} currently. Keep an eye out, fresh learning experiences are on the way!'
|
'There are no {0} currently. Keep an eye out, fresh learning experiences are on the way!'
|
||||||
).format(type?.toLowerCase())
|
).format(props.type)
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { computed } from 'vue'
|
||||||
import { BookOpen, GraduationCap } from 'lucide-vue-next'
|
import { BookOpen, GraduationCap } from 'lucide-vue-next'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
type: String,
|
type: String,
|
||||||
})
|
})
|
||||||
</script>
|
|
||||||
|
</script>
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
<div class="">
|
<div class="">
|
||||||
<div class="mb-1.5 text-sm text-ink-gray-5">
|
<div class="mb-1.5 text-sm text-ink-gray-5">
|
||||||
{{ __('Reply To') }}
|
{{ __('Reply To') }}
|
||||||
|
<span class="text-ink-red-3">*</span>
|
||||||
</div>
|
</div>
|
||||||
<Input type="text" v-model="announcement.replyTo" />
|
<Input type="text" v-model="announcement.replyTo" />
|
||||||
</div>
|
</div>
|
||||||
@@ -70,8 +71,8 @@ const announcementResource = createResource({
|
|||||||
url: 'frappe.core.doctype.communication.email.make',
|
url: 'frappe.core.doctype.communication.email.make',
|
||||||
makeParams(values) {
|
makeParams(values) {
|
||||||
return {
|
return {
|
||||||
recipients: props.students.join(', '),
|
recipients: announcement.replyTo,
|
||||||
cc: announcement.replyTo,
|
bcc: props.students.join(', '),
|
||||||
subject: announcement.subject,
|
subject: announcement.subject,
|
||||||
content: announcement.announcement,
|
content: announcement.announcement,
|
||||||
doctype: 'LMS Batch',
|
doctype: 'LMS Batch',
|
||||||
@@ -95,6 +96,9 @@ const makeAnnouncement = (close) => {
|
|||||||
if (!announcement.announcement) {
|
if (!announcement.announcement) {
|
||||||
return __('Announcement is required')
|
return __('Announcement is required')
|
||||||
}
|
}
|
||||||
|
if (!announcement.replyTo) {
|
||||||
|
return __('Reply To is required')
|
||||||
|
}
|
||||||
},
|
},
|
||||||
onSuccess() {
|
onSuccess() {
|
||||||
close()
|
close()
|
||||||
|
|||||||
@@ -97,9 +97,9 @@ const addAssessment = (close) => {
|
|||||||
|
|
||||||
const assessmentTypes = computed(() => {
|
const assessmentTypes = computed(() => {
|
||||||
return [
|
return [
|
||||||
{ label: 'Quiz', value: 'LMS Quiz' },
|
{ label: __('Quiz'), value: 'LMS Quiz' },
|
||||||
{ label: 'Assignment', value: 'LMS Assignment' },
|
{ label: __('Assignment'), value: 'LMS Assignment' },
|
||||||
{ label: 'Programming Exercise', value: 'LMS Programming Exercise' },
|
{ label: __('Programming Exercise'), value: 'LMS Programming Exercise' },
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -144,11 +144,11 @@ const saveAssignment = () => {
|
|||||||
|
|
||||||
const assignmentOptions = computed(() => {
|
const assignmentOptions = computed(() => {
|
||||||
return [
|
return [
|
||||||
{ label: 'PDF', value: 'PDF' },
|
{ label: __('PDF'), value: 'PDF' },
|
||||||
{ label: 'Image', value: 'Image' },
|
{ label: __('Image'), value: 'Image' },
|
||||||
{ label: 'Document', value: 'Document' },
|
{ label: __('Document'), value: 'Document' },
|
||||||
{ label: 'Text', value: 'Text' },
|
{ label: __('Text'), value: 'Text' },
|
||||||
{ label: 'URL', value: 'URL' },
|
{ label: __('URL'), value: 'URL' },
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
</div> -->
|
</div> -->
|
||||||
<FormControl
|
<FormControl
|
||||||
v-model="searchFilter"
|
v-model="searchFilter"
|
||||||
:placeholder="__('Search by Member Name')"
|
:placeholder="__('Search by Member')"
|
||||||
type="text"
|
type="text"
|
||||||
class="w-full"
|
class="w-full"
|
||||||
/>
|
/>
|
||||||
@@ -149,6 +149,10 @@ import { theme } from '@/utils/theme'
|
|||||||
|
|
||||||
const show = defineModel<boolean | undefined>()
|
const show = defineModel<boolean | undefined>()
|
||||||
const searchFilter = ref<string | null>(null)
|
const searchFilter = ref<string | null>(null)
|
||||||
|
type Filters = {
|
||||||
|
course: string | undefined
|
||||||
|
member_name?: string[]
|
||||||
|
}
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
courseName?: string
|
courseName?: string
|
||||||
@@ -184,10 +188,6 @@ const progressList = createListResource({
|
|||||||
|
|
||||||
watch([searchFilter], () => {
|
watch([searchFilter], () => {
|
||||||
let filterApplied = false
|
let filterApplied = false
|
||||||
type Filters = {
|
|
||||||
course: string | undefined
|
|
||||||
member_name?: string[]
|
|
||||||
}
|
|
||||||
let filters: Filters = {
|
let filters: Filters = {
|
||||||
course: props.courseName,
|
course: props.courseName,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,15 +139,15 @@ const getTimezoneOptions = () => {
|
|||||||
const getRecordingOptions = () => {
|
const getRecordingOptions = () => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'No Recording',
|
label: __('No Recording'),
|
||||||
value: 'No Recording',
|
value: 'No Recording',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Local',
|
label: __('Local'),
|
||||||
value: 'Local',
|
value: 'Local',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Cloud',
|
label: __('Cloud'),
|
||||||
value: 'Cloud',
|
value: 'Cloud',
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -8,13 +8,20 @@
|
|||||||
>
|
>
|
||||||
<template #body-content>
|
<template #body-content>
|
||||||
<div class="text-base">
|
<div class="text-base">
|
||||||
<TabButtons
|
<div class="flex items-center justify-between">
|
||||||
v-if="tabs.length > 1"
|
<TabButtons
|
||||||
:buttons="tabs"
|
v-if="tabs.length > 1"
|
||||||
v-model="currentTab"
|
:buttons="tabs"
|
||||||
class="w-fit"
|
v-model="currentTab"
|
||||||
/>
|
class="w-fit"
|
||||||
<div v-if="currentTab" class="mt-8">
|
/>
|
||||||
|
<!-- <FormControl
|
||||||
|
v-model="searchText"
|
||||||
|
:placeholder="__('Search by Member')"
|
||||||
|
class="mt-2 mr-5 w-[25%]"
|
||||||
|
/> -->
|
||||||
|
</div>
|
||||||
|
<div v-if="currentTab" class="mt-4">
|
||||||
<div class="grid grid-cols-[55%,40%] gap-5">
|
<div class="grid grid-cols-[55%,40%] gap-5">
|
||||||
<div class="space-y-5 border rounded-md p-2 pt-4">
|
<div class="space-y-5 border rounded-md p-2 pt-4">
|
||||||
<div class="grid grid-cols-[70%,30%] text-sm text-ink-gray-5">
|
<div class="grid grid-cols-[70%,30%] text-sm text-ink-gray-5">
|
||||||
@@ -52,7 +59,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center text-sm">
|
<div class="text-center text-sm">
|
||||||
{{ parseFloat(row.watch_time).toFixed(2) }}
|
{{ convertToMinutes(row.watch_time) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -62,7 +69,7 @@
|
|||||||
<NumberChart
|
<NumberChart
|
||||||
class="border rounded-md"
|
class="border rounded-md"
|
||||||
:config="{
|
:config="{
|
||||||
title: __('Average Watch Time (seconds)'),
|
title: __('Average Watch Time (minutes)'),
|
||||||
value: averageWatchTime,
|
value: averageWatchTime,
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
@@ -73,6 +80,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else class="text-sm text-ink-gray-5">
|
||||||
|
{{ __('No statistics available for this video.') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
@@ -82,15 +92,21 @@ import {
|
|||||||
Avatar,
|
Avatar,
|
||||||
createListResource,
|
createListResource,
|
||||||
Dialog,
|
Dialog,
|
||||||
|
FormControl,
|
||||||
NumberChart,
|
NumberChart,
|
||||||
TabButtons,
|
TabButtons,
|
||||||
} from 'frappe-ui'
|
} from 'frappe-ui'
|
||||||
import { computed, ref, watch } from 'vue'
|
import { computed, ref, watch } from 'vue'
|
||||||
import { enablePlyr } from '@/utils'
|
import { enablePlyr, convertToMinutes } from '@/utils'
|
||||||
import VideoBlock from '@/components/VideoBlock.vue'
|
import VideoBlock from '@/components/VideoBlock.vue'
|
||||||
|
|
||||||
const show = defineModel<boolean | undefined>()
|
const show = defineModel<boolean | undefined>()
|
||||||
const currentTab = ref<string>('')
|
const currentTab = ref<string>('')
|
||||||
|
const searchText = ref<string>('')
|
||||||
|
type Filters = {
|
||||||
|
lesson: string | undefined
|
||||||
|
member_name?: string[]
|
||||||
|
}
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
lessonName?: string
|
lessonName?: string
|
||||||
@@ -127,6 +143,24 @@ watch(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
watch(searchText, () => {
|
||||||
|
let filterApplied = false
|
||||||
|
let filters: Filters = {
|
||||||
|
lesson: props.lessonName,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchText.value) {
|
||||||
|
filters.member_name = ['like', `%${searchText.value}%`]
|
||||||
|
filterApplied = true
|
||||||
|
}
|
||||||
|
|
||||||
|
statistics.update({
|
||||||
|
filters: filters,
|
||||||
|
})
|
||||||
|
|
||||||
|
statistics.reload({})
|
||||||
|
})
|
||||||
|
|
||||||
watch(show, () => {
|
watch(show, () => {
|
||||||
if (show.value) {
|
if (show.value) {
|
||||||
enablePlyr()
|
enablePlyr()
|
||||||
@@ -151,7 +185,7 @@ const averageWatchTime = computed(() => {
|
|||||||
totalWatchTime += parseFloat(item.watch_time)
|
totalWatchTime += parseFloat(item.watch_time)
|
||||||
})
|
})
|
||||||
|
|
||||||
return totalWatchTime / currentTabData.value.length
|
return convertToMinutes(totalWatchTime / currentTabData.value.length)
|
||||||
})
|
})
|
||||||
|
|
||||||
const currentTabData = computed(() => {
|
const currentTabData = computed(() => {
|
||||||
|
|||||||
@@ -665,25 +665,25 @@ const markLessonProgress = () => {
|
|||||||
const getSubmissionColumns = () => {
|
const getSubmissionColumns = () => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'No.',
|
label: __('No.'),
|
||||||
key: 'idx',
|
key: 'idx',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Date',
|
label: __('Date'),
|
||||||
key: 'creation',
|
key: 'creation',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Score',
|
label: __('Score'),
|
||||||
key: 'score',
|
key: 'score',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Score out of',
|
label: __('Score out of'),
|
||||||
key: 'score_out_of',
|
key: 'score_out_of',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Percentage',
|
label: __('Percentage'),
|
||||||
key: 'percentage',
|
key: 'percentage',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
>
|
>
|
||||||
{{ branding.data?.app_name }}
|
{{ branding.data?.app_name }}
|
||||||
</span>
|
</span>
|
||||||
<span v-else> Learning </span>
|
<span v-else> {{ __('Learning') }} </span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="userResource.data"
|
v-if="userResource.data"
|
||||||
@@ -130,7 +130,7 @@ const userDropdownOptions = computed(() => {
|
|||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
icon: User,
|
icon: User,
|
||||||
label: 'My Profile',
|
label: __('My Profile'),
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
router.push(`/user/${userResource.data?.username}`)
|
router.push(`/user/${userResource.data?.username}`)
|
||||||
},
|
},
|
||||||
@@ -140,7 +140,7 @@ const userDropdownOptions = computed(() => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: theme.value === 'light' ? Moon : Sun,
|
icon: theme.value === 'light' ? Moon : Sun,
|
||||||
label: 'Toggle Theme',
|
label: __('Toggle Theme'),
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
toggleTheme()
|
toggleTheme()
|
||||||
},
|
},
|
||||||
@@ -158,7 +158,7 @@ const userDropdownOptions = computed(() => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: Settings,
|
icon: Settings,
|
||||||
label: 'Settings',
|
label: __('Settings'),
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
settingsStore.isSettingsOpen = true
|
settingsStore.isSettingsOpen = true
|
||||||
},
|
},
|
||||||
@@ -168,7 +168,7 @@ const userDropdownOptions = computed(() => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: FrappeCloudIcon,
|
icon: FrappeCloudIcon,
|
||||||
label: 'Login to Frappe Cloud',
|
label: __('Login to Frappe Cloud'),
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
$dialog({
|
$dialog({
|
||||||
title: __('Login to Frappe Cloud?'),
|
title: __('Login to Frappe Cloud?'),
|
||||||
@@ -196,7 +196,7 @@ const userDropdownOptions = computed(() => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: LogOut,
|
icon: LogOut,
|
||||||
label: 'Log out',
|
label: __('Log out'),
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
logout.submit().then(() => {
|
logout.submit().then(() => {
|
||||||
isLoggedIn = false
|
isLoggedIn = false
|
||||||
@@ -208,7 +208,7 @@ const userDropdownOptions = computed(() => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: LogIn,
|
icon: LogIn,
|
||||||
label: 'Log in',
|
label: __('Log in'),
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
window.location.href = '/login'
|
window.location.href = '/login'
|
||||||
},
|
},
|
||||||
|
|||||||
5
frontend/src/global.d.ts
vendored
5
frontend/src/global.d.ts
vendored
@@ -1,11 +1,12 @@
|
|||||||
export {}
|
export {}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
function __(text: string): string
|
// May return string or an object with `.format(...)` when placeholders exist
|
||||||
|
function __(text: string): any
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module 'vue' {
|
declare module 'vue' {
|
||||||
interface ComponentCustomProperties {
|
interface ComponentCustomProperties {
|
||||||
__: (text: string) => string
|
__: (text: string) => any
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
70
frontend/src/overrides/Onboarding/GettingStartedBanner.vue
Normal file
70
frontend/src/overrides/Onboarding/GettingStartedBanner.vue
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
v-if="!isSidebarCollapsed"
|
||||||
|
class="flex flex-col gap-3 shadow-sm rounded-lg py-2.5 px-3 bg-surface-modal text-base"
|
||||||
|
>
|
||||||
|
<div v-if="stepsCompleted != totalSteps" class="inline-flex text-ink-gray-9 gap-2">
|
||||||
|
<StepsIcon class="h-4 my-0.5 shrink-0" />
|
||||||
|
<div class="flex flex-col text-p-sm gap-0.5">
|
||||||
|
<div class="font-medium">
|
||||||
|
{{ __('Getting started') }}
|
||||||
|
</div>
|
||||||
|
<div class="text-ink-gray-7">
|
||||||
|
{{ __('{0}/{1} steps').format(stepsCompleted, totalSteps) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else class="flex flex-col gap-1">
|
||||||
|
<div class="flex items-center justify-between gap-1">
|
||||||
|
<div class="flex items-center gap-2 shrink-0">
|
||||||
|
<StepsIcon class="h-4 my-0.5" />
|
||||||
|
<div class="text-ink-gray-9 font-medium">
|
||||||
|
{{ __('You are all set') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<FeatherIcon
|
||||||
|
name="x"
|
||||||
|
class="h-4 cursor-pointer"
|
||||||
|
@click="() => { showHelpCenter = true; isOnboardingStepsCompleted = true }"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="text-p-sm text-ink-gray-7">
|
||||||
|
{{ __('All steps are completed successfully') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
v-if="stepsCompleted != totalSteps"
|
||||||
|
:label="stepsCompleted == 0 ? __('Start now') : __('Continue')"
|
||||||
|
theme="blue"
|
||||||
|
@click="openOnboarding"
|
||||||
|
>
|
||||||
|
<template #prefix>
|
||||||
|
<FeatherIcon name="chevrons-right" class="size-4" />
|
||||||
|
</template>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<Button v-else-if="stepsCompleted != totalSteps" @click="openOnboarding">
|
||||||
|
<StepsIcon class="h-4 my-0.5 shrink-0" />
|
||||||
|
</Button>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import StepsIcon from 'frappe-ui/frappe/Icons/StepsIcon.vue'
|
||||||
|
import Button from 'frappe-ui/src/components/Button/Button.vue'
|
||||||
|
import FeatherIcon from 'frappe-ui/src/components/FeatherIcon.vue'
|
||||||
|
import { useOnboarding } from 'frappe-ui/frappe/Onboarding/onboarding'
|
||||||
|
import { showHelpCenter } from 'frappe-ui/frappe/HelpCenter/helpCenter'
|
||||||
|
import { showHelpModal, minimize } from 'frappe-ui/frappe/Help/help'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
isSidebarCollapsed: { type: Boolean, default: false },
|
||||||
|
appName: { type: String, default: 'frappecrm' },
|
||||||
|
})
|
||||||
|
|
||||||
|
const { stepsCompleted, totalSteps, isOnboardingStepsCompleted } = useOnboarding(props.appName)
|
||||||
|
|
||||||
|
const openOnboarding = () => {
|
||||||
|
minimize.value = false
|
||||||
|
showHelpModal.value = true
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
112
frontend/src/overrides/Onboarding/OnboardingSteps.vue
Normal file
112
frontend/src/overrides/Onboarding/OnboardingSteps.vue
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
<template>
|
||||||
|
<div class="flex flex-col justify-center items-center gap-1 mt-4 mb-7">
|
||||||
|
<component :is="logo" class="size-10 shrink-0 rounded mb-4" />
|
||||||
|
<div class="text-base font-medium">
|
||||||
|
{{ __('Welcome to {0}').format(title) }}
|
||||||
|
</div>
|
||||||
|
<div class="text-p-base font-normal">
|
||||||
|
{{ __('{0}/{1} steps completed').format(stepsCompleted, totalSteps) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-2.5 overflow-hidden">
|
||||||
|
<div class="flex justify-between items-center py-0.5">
|
||||||
|
<Badge
|
||||||
|
:label="__('{0}% completed').format(completedPercentage)"
|
||||||
|
:theme="completedPercentage == 100 ? 'green' : 'orange'"
|
||||||
|
size="lg"
|
||||||
|
/>
|
||||||
|
<div class="flex">
|
||||||
|
<Button
|
||||||
|
v-if="completedPercentage != 0"
|
||||||
|
variant="ghost"
|
||||||
|
:label="__('Reset all')"
|
||||||
|
@click="() => resetAll(afterResetAll)"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
v-if="completedPercentage != 100"
|
||||||
|
variant="ghost"
|
||||||
|
:label="__('Skip all')"
|
||||||
|
@click="() => skipAll(afterSkipAll)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-1.5 overflow-y-auto">
|
||||||
|
<div
|
||||||
|
v-for="step in steps"
|
||||||
|
:key="step.title"
|
||||||
|
class="group w-full flex gap-2 justify-between items-center hover:bg-surface-gray-1 rounded px-2 py-1.5 cursor-pointer"
|
||||||
|
@click.stop="() => !step.completed && !isDependent(step) && step.onClick()"
|
||||||
|
>
|
||||||
|
<component :is="isDependent(step) ? Tooltip : 'div'" :text="dependsOnTooltip(step)">
|
||||||
|
<div
|
||||||
|
class="flex gap-2 items-center"
|
||||||
|
:class="[
|
||||||
|
step.completed
|
||||||
|
? 'text-ink-gray-5'
|
||||||
|
: isDependent(step)
|
||||||
|
? 'text-ink-gray-4'
|
||||||
|
: 'text-ink-gray-8',
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<component :is="step.icon" class="h-4" />
|
||||||
|
<div class="text-base" :class="{ 'line-through': step.completed }">
|
||||||
|
{{ step.title }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</component>
|
||||||
|
<Button
|
||||||
|
v-if="!step.completed && !isDependent(step)"
|
||||||
|
:label="__('Skip')"
|
||||||
|
class="!h-4 text-xs !text-ink-gray-6 hidden group-hover:flex"
|
||||||
|
@click="() => skip(step.name, afterSkip)"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
v-else-if="!isDependent(step)"
|
||||||
|
:label="__('Reset')"
|
||||||
|
class="!h-4 text-xs !text-ink-gray-6 hidden group-hover:flex"
|
||||||
|
@click.stop="() => reset(step.name, afterReset)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import { useOnboarding } from 'frappe-ui/frappe/Onboarding/onboarding'
|
||||||
|
import Tooltip from 'frappe-ui/src/components/Tooltip/Tooltip.vue'
|
||||||
|
import Button from 'frappe-ui/src/components/Button/Button.vue'
|
||||||
|
import Badge from 'frappe-ui/src/components/Badge/Badge.vue'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
appName: { type: String, default: 'frappecrm' },
|
||||||
|
title: { type: String, default: 'Frappe CRM' },
|
||||||
|
logo: { type: Object, required: true },
|
||||||
|
afterSkip: { type: Function, default: () => {} },
|
||||||
|
afterSkipAll: { type: Function, default: () => {} },
|
||||||
|
afterReset: { type: Function, default: () => {} },
|
||||||
|
afterResetAll: { type: Function, default: () => {} },
|
||||||
|
})
|
||||||
|
|
||||||
|
function isDependent(step) {
|
||||||
|
if (step.dependsOn && !step.completed) {
|
||||||
|
const dependsOnStep = steps.find((s) => s.name === step.dependsOn)
|
||||||
|
if (dependsOnStep && !dependsOnStep.completed) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
function dependsOnTooltip(step) {
|
||||||
|
if (step.dependsOn && !step.completed) {
|
||||||
|
const dependsOnStep = steps.find((s) => s.name === step.dependsOn)
|
||||||
|
if (dependsOnStep && !dependsOnStep.completed) {
|
||||||
|
return `You need to complete "${dependsOnStep.title}" first.`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const { steps, stepsCompleted, totalSteps, completedPercentage, skip, skipAll, reset, resetAll } =
|
||||||
|
useOnboarding(props.appName)
|
||||||
|
</script>
|
||||||
|
|
||||||
@@ -166,23 +166,23 @@ const reloadSubmissions = () => {
|
|||||||
const submissionColumns = computed(() => {
|
const submissionColumns = computed(() => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'Member',
|
label: __('Member'),
|
||||||
key: 'member_name',
|
key: 'member_name',
|
||||||
width: 1,
|
width: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Assignment',
|
label: __('Assignment'),
|
||||||
key: 'assignment_title',
|
key: 'assignment_title',
|
||||||
width: 2,
|
width: 2,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Submitted',
|
label: __('Submitted'),
|
||||||
key: 'creation',
|
key: 'creation',
|
||||||
width: 1,
|
width: 1,
|
||||||
align: 'left',
|
align: 'left',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Status',
|
label: __('Status'),
|
||||||
key: 'status',
|
key: 'status',
|
||||||
width: 1,
|
width: 1,
|
||||||
align: 'center',
|
align: 'center',
|
||||||
@@ -193,9 +193,9 @@ const submissionColumns = computed(() => {
|
|||||||
const statusOptions = computed(() => {
|
const statusOptions = computed(() => {
|
||||||
return [
|
return [
|
||||||
{ label: '', value: '' },
|
{ label: '', value: '' },
|
||||||
{ label: 'Pass', value: 'Pass' },
|
{ label: __('Pass'), value: 'Pass' },
|
||||||
{ label: 'Fail', value: 'Fail' },
|
{ label: __('Fail'), value: 'Fail' },
|
||||||
{ label: 'Not Graded', value: 'Not Graded' },
|
{ label: __('Not Graded'), value: 'Not Graded' },
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -212,7 +212,7 @@ const getStatusTheme = (status) => {
|
|||||||
const breadcrumbs = computed(() => {
|
const breadcrumbs = computed(() => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'Assignment Submissions',
|
label: __('Assignment Submissions'),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
</ListView>
|
</ListView>
|
||||||
<EmptyState v-else type="Assignments" />
|
<EmptyState v-else :type="__('Assignments').toLowerCase()" />
|
||||||
<div
|
<div
|
||||||
v-if="assignments.data && assignments.hasNextPage"
|
v-if="assignments.data && assignments.hasNextPage"
|
||||||
class="flex justify-center my-5"
|
class="flex justify-center my-5"
|
||||||
@@ -198,7 +198,7 @@ const assignmentTypes = computed(() => {
|
|||||||
|
|
||||||
const breadcrumbs = computed(() => [
|
const breadcrumbs = computed(() => [
|
||||||
{
|
{
|
||||||
label: 'Assignments',
|
label: __('Assignments'),
|
||||||
route: { name: 'Assignments' },
|
route: { name: 'Assignments' },
|
||||||
},
|
},
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -317,10 +317,10 @@ const batch = createResource({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const breadcrumbs = computed(() => {
|
const breadcrumbs = computed(() => {
|
||||||
let crumbs = [{ label: 'Batches', route: { name: 'Batches' } }]
|
let crumbs = [{ label: __('Batches'), route: { name: 'Batches' } }]
|
||||||
if (!isStudent.value) {
|
if (!isStudent.value) {
|
||||||
crumbs.push({
|
crumbs.push({
|
||||||
label: 'Details',
|
label: __('Details'),
|
||||||
route: {
|
route: {
|
||||||
name: 'BatchDetail',
|
name: 'BatchDetail',
|
||||||
params: {
|
params: {
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ const courses = createResource({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const breadcrumbs = computed(() => {
|
const breadcrumbs = computed(() => {
|
||||||
let items = [{ label: 'Batches', route: { name: 'Batches' } }]
|
let items = [{ label: __('Batches'), route: { name: 'Batches' } }]
|
||||||
items.push({
|
items.push({
|
||||||
label: batch?.data?.title,
|
label: batch?.data?.title,
|
||||||
route: { name: 'BatchDetail', params: { batchName: batch?.data?.name } },
|
route: { name: 'BatchDetail', params: { batchName: batch?.data?.name } },
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
<BatchCard :batch="batch" />
|
<BatchCard :batch="batch" />
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
<EmptyState v-else-if="!batches.list.loading" type="Batches" />
|
<EmptyState v-else-if="!batches.list.loading" :type="__('Batches').toLowerCase()" />
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="!batches.list.loading && batches.hasNextPage"
|
v-if="!batches.list.loading && batches.hasNextPage"
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ const participants = createListResource({
|
|||||||
doctype: 'LMS Certificate',
|
doctype: 'LMS Certificate',
|
||||||
url: 'lms.lms.api.get_certified_participants',
|
url: 'lms.lms.api.get_certified_participants',
|
||||||
start: 0,
|
start: 0,
|
||||||
|
cache: ['certified_participants'],
|
||||||
pageLength: 100,
|
pageLength: 100,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ watch(
|
|||||||
)
|
)
|
||||||
|
|
||||||
const breadcrumbs = computed(() => {
|
const breadcrumbs = computed(() => {
|
||||||
let items = [{ label: 'Courses', route: { name: 'Courses' } }]
|
let items = [{ label: __('Courses'), route: { name: 'Courses' } }]
|
||||||
items.push({
|
items.push({
|
||||||
label: course?.data?.title,
|
label: course?.data?.title,
|
||||||
route: { name: 'CourseDetail', params: { courseName: course?.data?.name } },
|
route: { name: 'CourseDetail', params: { courseName: course?.data?.name } },
|
||||||
|
|||||||
@@ -47,9 +47,16 @@
|
|||||||
:required="true"
|
:required="true"
|
||||||
/>
|
/>
|
||||||
<div>
|
<div>
|
||||||
<div class="mb-1.5 text-xs text-ink-gray-5">
|
<div class="text-xs text-ink-gray-5">
|
||||||
{{ __('Tags') }}
|
{{ __('Tags') }}
|
||||||
</div>
|
</div>
|
||||||
|
<FormControl
|
||||||
|
v-model="newTag"
|
||||||
|
:placeholder="__('Add a keyword and then press enter')"
|
||||||
|
:class="['w-full', 'flex-1', 'my-1']"
|
||||||
|
@keyup.enter="updateTags()"
|
||||||
|
id="tags"
|
||||||
|
/>
|
||||||
<div>
|
<div>
|
||||||
<div class="flex items-center flex-wrap gap-2">
|
<div class="flex items-center flex-wrap gap-2">
|
||||||
<div
|
<div
|
||||||
@@ -64,37 +71,13 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<FormControl
|
|
||||||
v-model="newTag"
|
|
||||||
:placeholder="__('Add a keyword and then press enter')"
|
|
||||||
:class="[
|
|
||||||
'w-full',
|
|
||||||
'flex-1',
|
|
||||||
{ 'mt-2': course.tags?.length },
|
|
||||||
]"
|
|
||||||
@keyup.enter="updateTags()"
|
|
||||||
id="tags"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2 gap-5">
|
<div class="grid grid-cols-2 gap-5">
|
||||||
<FormControl
|
|
||||||
v-model="course.short_introduction"
|
|
||||||
type="textarea"
|
|
||||||
:rows="5"
|
|
||||||
:label="__('Short Introduction')"
|
|
||||||
:placeholder="
|
|
||||||
__(
|
|
||||||
'A one line introduction to the course that appears on the course card'
|
|
||||||
)
|
|
||||||
"
|
|
||||||
:required="true"
|
|
||||||
/>
|
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<div class="text-xs text-ink-gray-5 mb-2">
|
<div class="text-xs text-ink-gray-5 mb-2">
|
||||||
{{ __('Course Image') }}
|
{{ __('Course Image') }}
|
||||||
<span class="text-ink-red-3">*</span>
|
|
||||||
</div>
|
</div>
|
||||||
<FileUploader
|
<FileUploader
|
||||||
v-if="!course.course_image"
|
v-if="!course.course_image"
|
||||||
@@ -144,6 +127,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<ColorSwatches
|
||||||
|
v-model="course.card_gradient"
|
||||||
|
:label="__('Color')"
|
||||||
|
:description="__('Choose a color for the course card')"
|
||||||
|
class="w-full"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -185,6 +175,21 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="px-10 pb-5 mb-5 space-y-5 border-b">
|
<div class="px-10 pb-5 mb-5 space-y-5 border-b">
|
||||||
|
<div class="text-lg font-semibold">
|
||||||
|
{{ __('About the Course') }}
|
||||||
|
</div>
|
||||||
|
<FormControl
|
||||||
|
v-model="course.short_introduction"
|
||||||
|
type="textarea"
|
||||||
|
:rows="5"
|
||||||
|
:label="__('Short Introduction')"
|
||||||
|
:placeholder="
|
||||||
|
__(
|
||||||
|
'A one line introduction to the course that appears on the course card'
|
||||||
|
)
|
||||||
|
"
|
||||||
|
:required="true"
|
||||||
|
/>
|
||||||
<div class="">
|
<div class="">
|
||||||
<div class="mb-1.5 text-sm text-ink-gray-5">
|
<div class="mb-1.5 text-sm text-ink-gray-5">
|
||||||
{{ __('Course Description') }}
|
{{ __('Course Description') }}
|
||||||
@@ -342,6 +347,7 @@ import {
|
|||||||
import Link from '@/components/Controls/Link.vue'
|
import Link from '@/components/Controls/Link.vue'
|
||||||
import CourseOutline from '@/components/CourseOutline.vue'
|
import CourseOutline from '@/components/CourseOutline.vue'
|
||||||
import MultiSelect from '@/components/Controls/MultiSelect.vue'
|
import MultiSelect from '@/components/Controls/MultiSelect.vue'
|
||||||
|
import ColorSwatches from '@/components/Controls/ColorSwatches.vue'
|
||||||
|
|
||||||
const user = inject('$user')
|
const user = inject('$user')
|
||||||
const newTag = ref('')
|
const newTag = ref('')
|
||||||
@@ -365,6 +371,7 @@ const course = reactive({
|
|||||||
description: '',
|
description: '',
|
||||||
video_link: '',
|
video_link: '',
|
||||||
course_image: null,
|
course_image: null,
|
||||||
|
card_gradient: '',
|
||||||
tags: '',
|
tags: '',
|
||||||
category: '',
|
category: '',
|
||||||
published: false,
|
published: false,
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="courses.data?.length"
|
v-if="courses.data?.length"
|
||||||
class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4 gap-5"
|
class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4 gap-8"
|
||||||
>
|
>
|
||||||
<router-link
|
<router-link
|
||||||
v-for="course in courses.data"
|
v-for="course in courses.data"
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
<CourseCard :course="course" />
|
<CourseCard :course="course" />
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
<EmptyState v-else-if="!courses.list.loading" type="Courses" />
|
<EmptyState v-else-if="!courses.list.loading" :type="__('Courses').toLowerCase()" />
|
||||||
<div
|
<div
|
||||||
v-if="!courses.list.loading && courses.hasNextPage"
|
v-if="!courses.list.loading && courses.hasNextPage"
|
||||||
class="flex justify-center mt-5"
|
class="flex justify-center mt-5"
|
||||||
|
|||||||
@@ -81,7 +81,7 @@
|
|||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<EmptyState v-else type="Job Openings" />
|
<EmptyState v-else :type="__('Job Openings').toLowerCase()" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -214,7 +214,7 @@
|
|||||||
<div class="mt-20" ref="discussionsContainer">
|
<div class="mt-20" ref="discussionsContainer">
|
||||||
<Discussions
|
<Discussions
|
||||||
v-if="allowDiscussions"
|
v-if="allowDiscussions"
|
||||||
:title="'Questions'"
|
:title="__('Questions')"
|
||||||
:doctype="'Course Lesson'"
|
:doctype="'Course Lesson'"
|
||||||
:docname="lesson.data.name"
|
:docname="lesson.data.name"
|
||||||
:key="lesson.data.name"
|
:key="lesson.data.name"
|
||||||
@@ -433,7 +433,7 @@ const progress = createResource({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const breadcrumbs = computed(() => {
|
const breadcrumbs = computed(() => {
|
||||||
let items = [{ label: 'Courses', route: { name: 'Courses' } }]
|
let items = [{ label: __('Courses'), route: { name: 'Courses' } }]
|
||||||
items.push({
|
items.push({
|
||||||
label: lesson?.data?.course_title,
|
label: lesson?.data?.course_title,
|
||||||
route: { name: 'CourseDetail', params: { courseName: props.courseName } },
|
route: { name: 'CourseDetail', params: { courseName: props.courseName } },
|
||||||
@@ -604,7 +604,7 @@ const updateVideoTime = (video) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const startTimer = () => {
|
const startTimer = () => {
|
||||||
timerInterval = setInterval(() => {
|
let timerInterval = setInterval(() => {
|
||||||
timer.value++
|
timer.value++
|
||||||
if (timer.value == 30) {
|
if (timer.value == 30) {
|
||||||
clearInterval(timerInterval)
|
clearInterval(timerInterval)
|
||||||
|
|||||||
@@ -714,17 +714,6 @@ iframe {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cdx-block.embed-tool::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: transparent;
|
|
||||||
z-index: 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--plyr-range-fill-background: white;
|
--plyr-range-fill-background: white;
|
||||||
--plyr-video-control-background-hover: transparent;
|
--plyr-video-control-background-hover: transparent;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
</Button>
|
</Button>
|
||||||
<TabButtons
|
<TabButtons
|
||||||
class="inline-block"
|
class="inline-block"
|
||||||
:buttons="[{ label: 'Unread', active: true }, { label: 'Read' }]"
|
:buttons="[{ label: __('Unread'), active: true }, { label: __('Read') }]"
|
||||||
v-model="activeTab"
|
v-model="activeTab"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -144,7 +144,7 @@ onUnmounted(() => {
|
|||||||
const breadcrumbs = computed(() => {
|
const breadcrumbs = computed(() => {
|
||||||
let crumbs = [
|
let crumbs = [
|
||||||
{
|
{
|
||||||
label: 'Notifications',
|
label: __('Notifications'),
|
||||||
route: {
|
route: {
|
||||||
name: 'Notifications',
|
name: 'Notifications',
|
||||||
},
|
},
|
||||||
@@ -155,7 +155,7 @@ const breadcrumbs = computed(() => {
|
|||||||
|
|
||||||
usePageMeta(() => {
|
usePageMeta(() => {
|
||||||
return {
|
return {
|
||||||
title: 'Notifications',
|
title: __('Notifications'),
|
||||||
icon: brand.favicon,
|
icon: brand.favicon,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -195,14 +195,14 @@ const isSessionUser = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getTabButtons = () => {
|
const getTabButtons = () => {
|
||||||
let buttons = [{ label: 'About' }, { label: 'Certificates' }]
|
let buttons = [{ label: __('About') }, { label: __('Certificates') }]
|
||||||
if ($user.data?.is_moderator) buttons.push({ label: 'Roles' })
|
if ($user.data?.is_moderator) buttons.push({ label: __('Roles') })
|
||||||
if (
|
if (
|
||||||
isSessionUser() &&
|
isSessionUser() &&
|
||||||
($user.data?.is_evaluator || $user.data?.is_moderator)
|
($user.data?.is_evaluator || $user.data?.is_moderator)
|
||||||
) {
|
) {
|
||||||
buttons.push({ label: 'Slots' })
|
buttons.push({ label: __('Slots') })
|
||||||
buttons.push({ label: 'Schedule' })
|
buttons.push({ label: __('Schedule') })
|
||||||
}
|
}
|
||||||
|
|
||||||
return buttons
|
return buttons
|
||||||
@@ -211,7 +211,7 @@ const getTabButtons = () => {
|
|||||||
const breadcrumbs = computed(() => {
|
const breadcrumbs = computed(() => {
|
||||||
let crumbs = [
|
let crumbs = [
|
||||||
{
|
{
|
||||||
label: 'People',
|
label: __('People'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: profile.data?.full_name,
|
label: profile.data?.full_name,
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ const evaluations = createListResource({
|
|||||||
],
|
],
|
||||||
auto: true,
|
auto: true,
|
||||||
orderBy: 'creation desc',
|
orderBy: 'creation desc',
|
||||||
limit: 100,
|
pageLength: 500,
|
||||||
cache: ['schedule', user.data?.name],
|
cache: ['schedule', user.data?.name],
|
||||||
transform(data) {
|
transform(data) {
|
||||||
return data.map((d) => {
|
return data.map((d) => {
|
||||||
|
|||||||
@@ -323,12 +323,12 @@ const saveProgram = () => {
|
|||||||
const courseColumns = computed(() => {
|
const courseColumns = computed(() => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'Title',
|
label: __('Title'),
|
||||||
key: 'course_title',
|
key: 'course_title',
|
||||||
width: 3,
|
width: 3,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'ID',
|
label: __('ID'),
|
||||||
key: 'course',
|
key: 'course',
|
||||||
width: 3,
|
width: 3,
|
||||||
},
|
},
|
||||||
@@ -338,19 +338,19 @@ const courseColumns = computed(() => {
|
|||||||
const memberColumns = computed(() => {
|
const memberColumns = computed(() => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'Member',
|
label: __('Member'),
|
||||||
key: 'member',
|
key: 'member',
|
||||||
width: 3,
|
width: 3,
|
||||||
align: 'left',
|
align: 'left',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Full Name',
|
label: __('Full Name'),
|
||||||
key: 'full_name',
|
key: 'full_name',
|
||||||
width: 3,
|
width: 3,
|
||||||
align: 'left',
|
align: 'left',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Progress (%)',
|
label: __('Progress (%)'),
|
||||||
key: 'progress',
|
key: 'progress',
|
||||||
width: 3,
|
width: 3,
|
||||||
align: 'right',
|
align: 'right',
|
||||||
@@ -361,11 +361,11 @@ const memberColumns = computed(() => {
|
|||||||
const breadbrumbs = computed(() => {
|
const breadbrumbs = computed(() => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'Programs',
|
label: __('Programs'),
|
||||||
route: { name: 'Programs' },
|
route: { name: 'Programs' },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: props.programName === 'new' ? 'New Program' : props.programName,
|
label: props.programName === 'new' ? __('New Program') : props.programName,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -82,7 +82,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<EmptyState v-else type="Programs" />
|
<EmptyState v-else :type="__('Programs').toLowerCase()" />
|
||||||
|
|
||||||
<Dialog
|
<Dialog
|
||||||
v-model="showDialog"
|
v-model="showDialog"
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
: __('No Quizzes')
|
: __('No Quizzes')
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
<FormControl v-model="search" type="text" placeholder="Search">
|
<FormControl v-model="search" type="text" :placeholder="__('Search')">
|
||||||
<template #prefix>
|
<template #prefix>
|
||||||
<FeatherIcon name="search" class="size-4 text-ink-gray-5" />
|
<FeatherIcon name="search" class="size-4 text-ink-gray-5" />
|
||||||
</template>
|
</template>
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</ListSelectBanner>
|
</ListSelectBanner>
|
||||||
</ListView>
|
</ListView>
|
||||||
<EmptyState v-else type="Quizzes" />
|
<EmptyState v-else :type="__('Quizzes').toLowerCase()" />
|
||||||
<div v-if="quizzes.hasNextPage" class="flex justify-center my-5">
|
<div v-if="quizzes.hasNextPage" class="flex justify-center my-5">
|
||||||
<Button @click="quizzes.next()">
|
<Button @click="quizzes.next()">
|
||||||
{{ __('Load More') }}
|
{{ __('Load More') }}
|
||||||
|
|||||||
@@ -7,23 +7,23 @@
|
|||||||
</header>
|
</header>
|
||||||
<div v-if="chartDetails.data" class="p-5">
|
<div v-if="chartDetails.data" class="p-5">
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-4">
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-4">
|
||||||
<Tooltip :text="__('Published Courses')">
|
<Tooltip :text="__('Published Courses')">
|
||||||
<NumberChart
|
<NumberChart
|
||||||
class="border rounded-md"
|
class="border rounded-md"
|
||||||
:config="{ title: 'Courses', value: chartDetails.data.courses }"
|
:config="{ title: __('Courses'), value: chartDetails.data.courses }"
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip :text="__('Active Members')">
|
<Tooltip :text="__('Active Members')">
|
||||||
<NumberChart
|
<NumberChart
|
||||||
class="border rounded-md"
|
class="border rounded-md"
|
||||||
:config="{ title: 'Signups', value: chartDetails.data.users }"
|
:config="{ title: __('Signups'), value: chartDetails.data.users }"
|
||||||
/>
|
/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip :text="__('Course Enrollments')">
|
<Tooltip :text="__('Course Enrollments')">
|
||||||
<NumberChart
|
<NumberChart
|
||||||
class="border rounded-md"
|
class="border rounded-md"
|
||||||
:config="{
|
:config="{
|
||||||
title: 'Enrollments',
|
title: __('Enrollments'),
|
||||||
value: chartDetails.data.enrollments,
|
value: chartDetails.data.enrollments,
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
@@ -31,8 +31,8 @@
|
|||||||
<Tooltip :text="__('Course Completions')">
|
<Tooltip :text="__('Course Completions')">
|
||||||
<NumberChart
|
<NumberChart
|
||||||
class="border rounded-md"
|
class="border rounded-md"
|
||||||
:config="{
|
:config="{
|
||||||
title: 'Completions',
|
title: __('Completions'),
|
||||||
value: chartDetails.data.completions,
|
value: chartDetails.data.completions,
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
@@ -40,8 +40,8 @@
|
|||||||
<Tooltip :text="__('Certified Members')">
|
<Tooltip :text="__('Certified Members')">
|
||||||
<NumberChart
|
<NumberChart
|
||||||
class="border rounded-md"
|
class="border rounded-md"
|
||||||
:config="{
|
:config="{
|
||||||
title: 'Certifications',
|
title: __('Certifications'),
|
||||||
value: chartDetails.data.certifications,
|
value: chartDetails.data.certifications,
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
@@ -53,16 +53,16 @@
|
|||||||
v-if="signupsChart.data"
|
v-if="signupsChart.data"
|
||||||
:config="{
|
:config="{
|
||||||
data: signupsChart.data,
|
data: signupsChart.data,
|
||||||
title: 'Signups',
|
title: __('Signups'),
|
||||||
subtitle: 'Signups per month',
|
subtitle: __('Signups per month'),
|
||||||
xAxis: {
|
xAxis: {
|
||||||
key: 'date',
|
key: 'date',
|
||||||
type: 'time',
|
type: 'time',
|
||||||
title: 'Date',
|
title: __('Date'),
|
||||||
timeGrain: 'day',
|
timeGrain: 'day',
|
||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
title: 'Signups',
|
title: __('Signups'),
|
||||||
},
|
},
|
||||||
series: [{ name: 'signups', type: 'line', showDataPoints: true }],
|
series: [{ name: 'signups', type: 'line', showDataPoints: true }],
|
||||||
}"
|
}"
|
||||||
@@ -73,16 +73,16 @@
|
|||||||
v-if="enrollmentChart.data"
|
v-if="enrollmentChart.data"
|
||||||
:config="{
|
:config="{
|
||||||
data: enrollmentChart.data,
|
data: enrollmentChart.data,
|
||||||
title: 'Enrollments',
|
title: __('Enrollments'),
|
||||||
subtitle: 'Enrollments per month',
|
subtitle: __('Enrollments per month'),
|
||||||
xAxis: {
|
xAxis: {
|
||||||
key: 'date',
|
key: 'date',
|
||||||
type: 'time',
|
type: 'time',
|
||||||
title: 'Date',
|
title: __('Date'),
|
||||||
timeGrain: 'day',
|
timeGrain: 'day',
|
||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
title: 'Enrollments',
|
title: __('Enrollments'),
|
||||||
},
|
},
|
||||||
series: [
|
series: [
|
||||||
{ name: 'enrollments', type: 'line', showDataPoints: true },
|
{ name: 'enrollments', type: 'line', showDataPoints: true },
|
||||||
@@ -95,16 +95,16 @@
|
|||||||
v-if="certification.data"
|
v-if="certification.data"
|
||||||
:config="{
|
:config="{
|
||||||
data: certification.data,
|
data: certification.data,
|
||||||
title: 'Certifications',
|
title: __('Certifications'),
|
||||||
subtitle: 'Certifications per month',
|
subtitle: __('Certifications per month'),
|
||||||
xAxis: {
|
xAxis: {
|
||||||
key: 'date',
|
key: 'date',
|
||||||
type: 'time',
|
type: 'time',
|
||||||
title: 'Date',
|
title: __('Date'),
|
||||||
timeGrain: 'day',
|
timeGrain: 'day',
|
||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
title: 'Certifications',
|
title: __('Certifications'),
|
||||||
},
|
},
|
||||||
series: [
|
series: [
|
||||||
{
|
{
|
||||||
@@ -121,8 +121,8 @@
|
|||||||
v-if="courseCompletion.data"
|
v-if="courseCompletion.data"
|
||||||
:config="{
|
:config="{
|
||||||
data: courseCompletion.data,
|
data: courseCompletion.data,
|
||||||
title: 'Completions',
|
title: __('Completions'),
|
||||||
subtitle: 'Course Completion',
|
subtitle: __('Course Completion'),
|
||||||
categoryColumn: 'label',
|
categoryColumn: 'label',
|
||||||
valueColumn: 'value',
|
valueColumn: 'value',
|
||||||
}"
|
}"
|
||||||
@@ -150,7 +150,7 @@ const { brand } = sessionStore()
|
|||||||
const breadcrumbs = computed(() => {
|
const breadcrumbs = computed(() => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'Statistics',
|
label: __('Statistics'),
|
||||||
route: {
|
route: {
|
||||||
name: 'Statistics',
|
name: 'Statistics',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -403,7 +403,7 @@ export function getUserTimezone() {
|
|||||||
export function getSidebarLinks() {
|
export function getSidebarLinks() {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
label: 'Courses',
|
label: __('Courses'),
|
||||||
icon: 'BookOpen',
|
icon: 'BookOpen',
|
||||||
to: 'Courses',
|
to: 'Courses',
|
||||||
activeFor: [
|
activeFor: [
|
||||||
@@ -415,36 +415,25 @@ export function getSidebarLinks() {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Batches',
|
label: __('Batches'),
|
||||||
icon: 'Users',
|
icon: 'Users',
|
||||||
to: 'Batches',
|
to: 'Batches',
|
||||||
activeFor: ['Batches', 'BatchDetail', 'Batch', 'BatchForm'],
|
activeFor: ['Batches', 'BatchDetail', 'Batch', 'BatchForm'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Programming Exercises',
|
label: __('Certified Members'),
|
||||||
icon: 'Code',
|
|
||||||
to: 'ProgrammingExercises',
|
|
||||||
activeFor: [
|
|
||||||
'ProgrammingExercises',
|
|
||||||
'ProgrammingExerciseForm',
|
|
||||||
'ProgrammingExerciseSubmissions',
|
|
||||||
'ProgrammingExerciseSubmission',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Certified Members',
|
|
||||||
icon: 'GraduationCap',
|
icon: 'GraduationCap',
|
||||||
to: 'CertifiedParticipants',
|
to: 'CertifiedParticipants',
|
||||||
activeFor: ['CertifiedParticipants'],
|
activeFor: ['CertifiedParticipants'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Jobs',
|
label: __('Jobs'),
|
||||||
icon: 'Briefcase',
|
icon: 'Briefcase',
|
||||||
to: 'Jobs',
|
to: 'Jobs',
|
||||||
activeFor: ['Jobs', 'JobDetail'],
|
activeFor: ['Jobs', 'JobDetail'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Statistics',
|
label: __('Statistics'),
|
||||||
icon: 'TrendingUp',
|
icon: 'TrendingUp',
|
||||||
to: 'Statistics',
|
to: 'Statistics',
|
||||||
activeFor: ['Statistics'],
|
activeFor: ['Statistics'],
|
||||||
@@ -551,11 +540,10 @@ export const enablePlyr = async () => {
|
|||||||
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
|
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
|
||||||
|
|
||||||
const setupPlyrForVideo = (video, players) => {
|
const setupPlyrForVideo = (video, players) => {
|
||||||
const src = video.getAttribute('src') || video.getAttribute('data-src')
|
const src = video.getAttribute('src')
|
||||||
|
|
||||||
if (src) {
|
if (src) {
|
||||||
const videoID = extractYouTubeId(src)
|
const videoID = extractYouTubeId(src)
|
||||||
video.setAttribute('data-plyr-provider', 'youtube')
|
|
||||||
video.setAttribute('data-plyr-embed-id', videoID)
|
video.setAttribute('data-plyr-embed-id', videoID)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -679,3 +667,9 @@ export const formatTimestamp = (seconds) => {
|
|||||||
const secs = String(date.getUTCSeconds()).padStart(2, '0')
|
const secs = String(date.getUTCSeconds()).padStart(2, '0')
|
||||||
return `${minutes}:${secs}`
|
return `${minutes}:${secs}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const convertToMinutes = (seconds) => {
|
||||||
|
const minutes = Math.floor(seconds / 60)
|
||||||
|
const remainingSeconds = Math.round(seconds % 60)
|
||||||
|
return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { defineConfig } from 'vite'
|
import {defineConfig} from 'vite'
|
||||||
import vue from '@vitejs/plugin-vue'
|
import vue from '@vitejs/plugin-vue'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
import frappeui from 'frappe-ui/vite'
|
import frappeui from 'frappe-ui/vite'
|
||||||
@@ -25,7 +25,7 @@ export default defineConfig({
|
|||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
server: {
|
server: {
|
||||||
allowedHosts: ['fs', 'per2'],
|
allowedHosts: ['lms.localhost', 'fs', 'per2'],
|
||||||
},
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
@@ -39,6 +39,7 @@ export default defineConfig({
|
|||||||
'showdown',
|
'showdown',
|
||||||
'engine.io-client',
|
'engine.io-client',
|
||||||
'tailwind.config.js',
|
'tailwind.config.js',
|
||||||
|
'interactjs',
|
||||||
'highlight.js',
|
'highlight.js',
|
||||||
'plyr',
|
'plyr',
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -38,9 +38,9 @@
|
|||||||
"@babel/types" "^7.28.0"
|
"@babel/types" "^7.28.0"
|
||||||
|
|
||||||
"@babel/types@^7.28.0":
|
"@babel/types@^7.28.0":
|
||||||
version "7.28.0"
|
version "7.28.1"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.0.tgz#2fd0159a6dc7353933920c43136335a9b264d950"
|
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.1.tgz#2aaf3c10b31ba03a77ac84f52b3912a0edef4cf9"
|
||||||
integrity sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==
|
integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/helper-string-parser" "^7.27.1"
|
"@babel/helper-string-parser" "^7.27.1"
|
||||||
"@babel/helper-validator-identifier" "^7.27.1"
|
"@babel/helper-validator-identifier" "^7.27.1"
|
||||||
@@ -161,9 +161,9 @@
|
|||||||
"@marijn/find-cluster-break" "^1.0.0"
|
"@marijn/find-cluster-break" "^1.0.0"
|
||||||
|
|
||||||
"@codemirror/view@6.x", "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0":
|
"@codemirror/view@6.x", "@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0":
|
||||||
version "6.38.0"
|
version "6.38.1"
|
||||||
resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.38.0.tgz#4486062b791a4247793e0953e05ae71a9e172217"
|
resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.38.1.tgz#74214434351719ec0710431363a85f7a01e80a73"
|
||||||
integrity sha512-yvSchUwHOdupXkd7xJ0ob36jdsSR/I+/C+VbY0ffBiL5NiSTEBDfB1ZGWbbIlDd5xgdUkody+lukAdOxYrOBeg==
|
integrity sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@codemirror/state" "^6.5.0"
|
"@codemirror/state" "^6.5.0"
|
||||||
crelt "^1.0.6"
|
crelt "^1.0.6"
|
||||||
@@ -386,7 +386,7 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@floating-ui/utils" "^0.2.10"
|
"@floating-ui/utils" "^0.2.10"
|
||||||
|
|
||||||
"@floating-ui/dom@^1.6.13", "@floating-ui/dom@^1.6.7", "@floating-ui/dom@^1.7.2":
|
"@floating-ui/dom@^1.6.13", "@floating-ui/dom@^1.6.7", "@floating-ui/dom@^1.7.0", "@floating-ui/dom@^1.7.2":
|
||||||
version "1.7.2"
|
version "1.7.2"
|
||||||
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.2.tgz#3540b051cf5ce0d4f4db5fb2507a76e8ea5b4a45"
|
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.2.tgz#3540b051cf5ce0d4f4db5fb2507a76e8ea5b4a45"
|
||||||
integrity sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==
|
integrity sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==
|
||||||
@@ -434,6 +434,11 @@
|
|||||||
local-pkg "^1.0.0"
|
local-pkg "^1.0.0"
|
||||||
mlly "^1.7.4"
|
mlly "^1.7.4"
|
||||||
|
|
||||||
|
"@interactjs/types@1.10.27":
|
||||||
|
version "1.10.27"
|
||||||
|
resolved "https://registry.yarnpkg.com/@interactjs/types/-/types-1.10.27.tgz#10afd71cef2498e2b5192cf0d46f937d8ceb767f"
|
||||||
|
integrity sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==
|
||||||
|
|
||||||
"@internationalized/date@^3.5.0", "@internationalized/date@^3.5.4":
|
"@internationalized/date@^3.5.0", "@internationalized/date@^3.5.4":
|
||||||
version "3.8.2"
|
version "3.8.2"
|
||||||
resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.8.2.tgz#977620c1407cc6830fd44cb505679d23c599e119"
|
resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.8.2.tgz#977620c1407cc6830fd44cb505679d23c599e119"
|
||||||
@@ -486,6 +491,11 @@
|
|||||||
"@jridgewell/resolve-uri" "^3.1.0"
|
"@jridgewell/resolve-uri" "^3.1.0"
|
||||||
"@jridgewell/sourcemap-codec" "^1.4.14"
|
"@jridgewell/sourcemap-codec" "^1.4.14"
|
||||||
|
|
||||||
|
"@juggle/resize-observer@^3.4.0":
|
||||||
|
version "3.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
|
||||||
|
integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
|
||||||
|
|
||||||
"@kurkle/color@^0.3.0":
|
"@kurkle/color@^0.3.0":
|
||||||
version "0.3.4"
|
version "0.3.4"
|
||||||
resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.4.tgz#4d4ff677e1609214fc71c580125ddddd86abcabf"
|
resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.4.tgz#4d4ff677e1609214fc71c580125ddddd86abcabf"
|
||||||
@@ -497,9 +507,9 @@
|
|||||||
integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==
|
integrity sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==
|
||||||
|
|
||||||
"@lezer/css@^1.1.0", "@lezer/css@^1.1.7":
|
"@lezer/css@^1.1.0", "@lezer/css@^1.1.7":
|
||||||
version "1.2.1"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.2.1.tgz#b35f6d0459e9be4de1cdf4d3132a59efd7cf2ba3"
|
resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.3.0.tgz#296f298814782c2fad42a936f3510042cdcd2034"
|
||||||
integrity sha512-2F5tOqzKEKbCUNraIXc0f6HKeyKlmMWJnBB0i4XW6dJgssrZO/YlZ2pY5xgyqDleqqhiNJ3dQhbrV2aClZQMvg==
|
integrity sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@lezer/common" "^1.2.0"
|
"@lezer/common" "^1.2.0"
|
||||||
"@lezer/highlight" "^1.0.0"
|
"@lezer/highlight" "^1.0.0"
|
||||||
@@ -596,105 +606,105 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-3.0.0.tgz#96fdb89d25c62e7b6a5d08caf0ce5114370e3b8f"
|
resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-3.0.0.tgz#96fdb89d25c62e7b6a5d08caf0ce5114370e3b8f"
|
||||||
integrity sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==
|
integrity sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm-eabi@4.44.1":
|
"@rollup/rollup-android-arm-eabi@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz#f768e3b2b0e6b55c595d7a053652c06413713983"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz#0592252f7550bc0ea0474bb5a22430850f92bdbd"
|
||||||
integrity sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==
|
integrity sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==
|
||||||
|
|
||||||
"@rollup/rollup-android-arm64@4.44.1":
|
"@rollup/rollup-android-arm64@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz#40379fd5501cfdfd7d8f86dfa1d3ce8d3a609493"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz#00a51d1d4380cc677da80ac9da1a19e7806bf57e"
|
||||||
integrity sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==
|
integrity sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-arm64@4.44.1":
|
"@rollup/rollup-darwin-arm64@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz#972c227bc89fe8a38a3f0c493e1966900e4e1ff7"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz#6638299dd282ebde1ebdf7dc5b0f150aa6e256e5"
|
||||||
integrity sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==
|
integrity sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==
|
||||||
|
|
||||||
"@rollup/rollup-darwin-x64@4.44.1":
|
"@rollup/rollup-darwin-x64@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz#96c919dcb87a5aa7dec5f7f77d90de881e578fdd"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz#33e61daa0a66890059648feda78e1075d4ea1bcb"
|
||||||
integrity sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==
|
integrity sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==
|
||||||
|
|
||||||
"@rollup/rollup-freebsd-arm64@4.44.1":
|
"@rollup/rollup-freebsd-arm64@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz#d199d8eaef830179c0c95b7a6e5455e893d1102c"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz#2cc4bd3ba7026cd5374e902285ce76e8fae0f6eb"
|
||||||
integrity sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==
|
integrity sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==
|
||||||
|
|
||||||
"@rollup/rollup-freebsd-x64@4.44.1":
|
"@rollup/rollup-freebsd-x64@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz#cab01f9e06ca756c1fabe87d64825ae016af4713"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz#64664ba3015deac473a5d6d6c60c068f274bf2d5"
|
||||||
integrity sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==
|
integrity sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-gnueabihf@4.44.1":
|
"@rollup/rollup-linux-arm-gnueabihf@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz#f6f1c42036dba0e58dc2315305429beff0d02c78"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz#7ab16acae3bcae863e9a9bc32038cd05e794a0ff"
|
||||||
integrity sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==
|
integrity sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm-musleabihf@4.44.1":
|
"@rollup/rollup-linux-arm-musleabihf@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz#1157e98e740facf858993fb51431dce3a4a96239"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz#bef91b1e924ab57e82e767dc2655264bbde7acc6"
|
||||||
integrity sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==
|
integrity sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-gnu@4.44.1":
|
"@rollup/rollup-linux-arm64-gnu@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz#b39db73f8a4c22e7db31a4f3fd45170105f33265"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz#0a811b16da334125f6e44570d0badf543876f49e"
|
||||||
integrity sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==
|
integrity sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==
|
||||||
|
|
||||||
"@rollup/rollup-linux-arm64-musl@4.44.1":
|
"@rollup/rollup-linux-arm64-musl@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz#4043398049fe4449c1485312d1ae9ad8af4056dd"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz#e8c166efe3cb963faaa924c7721eafbade63036f"
|
||||||
integrity sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==
|
integrity sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==
|
||||||
|
|
||||||
"@rollup/rollup-linux-loongarch64-gnu@4.44.1":
|
"@rollup/rollup-linux-loongarch64-gnu@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz#855a80e7e86490da15a85dcce247dbc25265bc08"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz#239feea00fa2a1e734bdff09b8d1c90def2abbf5"
|
||||||
integrity sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==
|
integrity sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu@4.44.1":
|
"@rollup/rollup-linux-powerpc64le-gnu@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz#8cf843cb7ab1d42e1dda680937cf0a2db6d59047"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz#1de2f926bddbf7d689a089277c1284ea6df4b6d1"
|
||||||
integrity sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==
|
integrity sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-gnu@4.44.1":
|
"@rollup/rollup-linux-riscv64-gnu@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz#287c085472976c8711f16700326f736a527f2f38"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz#28dbac643244e477a7b931feb9b475aa826f84c1"
|
||||||
integrity sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==
|
integrity sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==
|
||||||
|
|
||||||
"@rollup/rollup-linux-riscv64-musl@4.44.1":
|
"@rollup/rollup-linux-riscv64-musl@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz#095ad5e53a54ba475979f1b3226b92440c95c892"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz#5d05eeaedadec3625cd50e3ca5d35ef6f96a4bf0"
|
||||||
integrity sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==
|
integrity sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==
|
||||||
|
|
||||||
"@rollup/rollup-linux-s390x-gnu@4.44.1":
|
"@rollup/rollup-linux-s390x-gnu@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz#a3dec8281d8f2aef1703e48ebc65d29fe847933c"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz#55b0790f499fb7adc14eb074c4e46aef92915813"
|
||||||
integrity sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==
|
integrity sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-gnu@4.44.1":
|
"@rollup/rollup-linux-x64-gnu@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz#4b211e6fd57edd6a134740f4f8e8ea61972ff2c5"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz#e822632fe5b324b16bdc37149149c8c760b031fd"
|
||||||
integrity sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==
|
integrity sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==
|
||||||
|
|
||||||
"@rollup/rollup-linux-x64-musl@4.44.1":
|
"@rollup/rollup-linux-x64-musl@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz#3ecbf8e21b4157e57bb15dc6837b6db851f9a336"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz#19a3602cb8fabd7eb3087f0a1e1e01adac31bbff"
|
||||||
integrity sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==
|
integrity sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==
|
||||||
|
|
||||||
"@rollup/rollup-win32-arm64-msvc@4.44.1":
|
"@rollup/rollup-win32-arm64-msvc@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz#d4aae38465b2ad200557b53c8c817266a3ddbfd0"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz#42e08bf3ea4fc463fc9f199c4f0310a736f03eb1"
|
||||||
integrity sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==
|
integrity sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==
|
||||||
|
|
||||||
"@rollup/rollup-win32-ia32-msvc@4.44.1":
|
"@rollup/rollup-win32-ia32-msvc@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz#0258e8ca052abd48b23fd6113360fa0cd1ec3e23"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz#043d25557f59d7e28dfe38ee1f60ddcb95a08124"
|
||||||
integrity sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==
|
integrity sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==
|
||||||
|
|
||||||
"@rollup/rollup-win32-x64-msvc@4.44.1":
|
"@rollup/rollup-win32-x64-msvc@4.45.0":
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz#1c982f6a5044ffc2a35cd754a0951bdcb44d5ba0"
|
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz#0a7eecae41f463d6591c8fecd7a5c5087345ee36"
|
||||||
integrity sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==
|
integrity sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==
|
||||||
|
|
||||||
"@socket.io/component-emitter@~3.1.0":
|
"@socket.io/component-emitter@~3.1.0":
|
||||||
version "3.1.2"
|
version "3.1.2"
|
||||||
@@ -764,191 +774,191 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@tanstack/virtual-core" "3.13.12"
|
"@tanstack/virtual-core" "3.13.12"
|
||||||
|
|
||||||
"@tiptap/core@^2.11.7", "@tiptap/core@^2.24.0":
|
"@tiptap/core@^2.11.7", "@tiptap/core@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.24.0.tgz#aee1f945a2a60f90849a2c2c0912cb4e115deb6b"
|
resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.26.1.tgz#8f97c223629972221d4175e4779f6ee955c41a37"
|
||||||
integrity sha512-DDFd4jKN2xx7i7GL7FYVweQudXGhHDPErjnKNwaEh0togBVQtvNcGQGV0pW31oTUItzc29DgvEGjyb5z9zOZUQ==
|
integrity sha512-fymyd/XZvYiHjBoLt1gxs024xP/LY26d43R1vluYq7AHBL/7DE3ywzy+1GEsGyAv5Je2L0KBhNIR/izbq3Kaqg==
|
||||||
|
|
||||||
"@tiptap/extension-blockquote@^2.24.0":
|
"@tiptap/extension-blockquote@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.24.0.tgz#4d28aa0ae55172dfb1e60b553217540d8be5384b"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.26.1.tgz#8ad2b3c119ff22430432ef46c852c135c156d63b"
|
||||||
integrity sha512-UNa1y1zFTmE2SSQ/3C0CDLUOnJZzGWH0rlOg0CIYA2FQlVg/Sl6L4hxXFLcp2m2E4ixCMTDXBvxKVxpmpvu0UQ==
|
integrity sha512-viQ6AHRhjCYYipKK6ZepBzwZpkuMvO9yhRHeUZDvlSOAh8rvsUTSre0y74nu8QRYUt4a44lJJ6BpphJK7bEgYA==
|
||||||
|
|
||||||
"@tiptap/extension-bold@^2.24.0":
|
"@tiptap/extension-bold@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.24.0.tgz#94d1726e547734fc727651bd2cf66c6bc10bf2fc"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.26.1.tgz#1218b847d360d69b6fc9e30596991bc53bc8fb98"
|
||||||
integrity sha512-TZT9jZeJuhmVhylO8t5QFbqfgS0yK6d/Tx08UMB7QuGIcNQ83p/Ep2kGOx1N1KnrUKdKBRXTtOgVKSbVXDyLvQ==
|
integrity sha512-zCce9PRuTNhadFir71luLo99HERDpGJ0EEflGm7RN8I1SnNi9gD5ooK42BOIQtejGCJqg3hTPZiYDJC2hXvckQ==
|
||||||
|
|
||||||
"@tiptap/extension-bubble-menu@^2.24.0":
|
"@tiptap/extension-bubble-menu@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.24.0.tgz#dfcb476833f49771f70196bb6837e955615d7867"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.26.1.tgz#7d78abb95bfc96468b40819ec00e2770ddcf63ad"
|
||||||
integrity sha512-/YEayojvKC4571g/eQTkqJiXHlTpL3mRmg7E0ulnW8TuEVDbc+V64nit4xI4fgTUR5NppPEoSzVuy2XHORg6rg==
|
integrity sha512-oHevUcZbTMFOTpdCEo4YEDe044MB4P1ZrWyML8CGe5tnnKdlI9BN03AXpI1mEEa5CA3H1/eEckXx8EiCgYwQ3Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
tippy.js "^6.3.7"
|
tippy.js "^6.3.7"
|
||||||
|
|
||||||
"@tiptap/extension-bullet-list@^2.24.0":
|
"@tiptap/extension-bullet-list@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.24.0.tgz#1c5e0e8ef6f9d55771ffa7b4254a19bd65ef3b92"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.26.1.tgz#b92170ca5d0b3404599799277fd73a124e81d093"
|
||||||
integrity sha512-p67EoSsvhys3D0a5jjnorEapV71nX6ZkhsNfrqsio3h3cc1YONA47wbx8bCnahMR8BtczzUNhdRHM5LHLjzPTA==
|
integrity sha512-HHakuV4ckYCDOnBbne088FvCEP4YICw+wgPBz/V2dfpiFYQ4WzT0LPK9s7OFMCN+ROraoug+1ryN1Z1KdIgujQ==
|
||||||
|
|
||||||
"@tiptap/extension-code-block-lowlight@^2.11.5":
|
"@tiptap/extension-code-block-lowlight@^2.11.5":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.24.0.tgz#d88db01836d485f02bd62f68853142bb37339ecf"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.26.1.tgz#42033f833906de3cf66263598dc4cad70fe3651d"
|
||||||
integrity sha512-NXE6DG3uLdkchIJlnQGp45FNvaEJhE5CM9fgJ/4ylDgd9S2aXXP6BVPjti35L2DszNui+QeHa75ZjcBAQyG4YQ==
|
integrity sha512-yptuTPYAzVMKHUTwNKYveuu0rYHYyFknPz3O2++PWeeBGxkNB+T6LhwZ/JhXceHcZxzlGyka9r2mXR7pslhugw==
|
||||||
|
|
||||||
"@tiptap/extension-code-block@^2.11.9", "@tiptap/extension-code-block@^2.24.0":
|
"@tiptap/extension-code-block@^2.11.9", "@tiptap/extension-code-block@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.24.0.tgz#bf8c6c21bad2e64134e0ecca9553984643f46e3f"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.26.1.tgz#dd6f9ec59440844f8e0ab0b33a75ff8ab6b6669f"
|
||||||
integrity sha512-1k2WhFpxd1Q/zGSYZn7YRhBAMLK3jAafIp0Rkf2iHs0vqbL+iHtrWAu5DFaWfNisTF7PrYXhjyIK9+UTQXCuaw==
|
integrity sha512-/TDDOwONl0qEUc4+B6V9NnWtSjz95eg7/8uCb8Y8iRbGvI9vT4/znRKofFxstvKmW4URu/H74/g0ywV57h0B+A==
|
||||||
|
|
||||||
"@tiptap/extension-code@^2.24.0":
|
"@tiptap/extension-code@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.24.0.tgz#b71a934110120987813cd445633960e3cc1ab883"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.26.1.tgz#ed289955423da20faa6ef4c81472835ac5fe1574"
|
||||||
integrity sha512-2pYGdTSyzjJrxsMNGpm8+E+Z60iMdUn4AYhrTfSHKObvZbGEhqWpxBRIUjL6xulSjYxmXzQFrYzh0BWYuXYPeA==
|
integrity sha512-GU9deB1A/Tr4FMPu71CvlcjGKwRhGYz60wQ8m4aM+ELZcVIcZRa1ebR8bExRIEWnvRztQuyRiCQzw2N0xQJ1QQ==
|
||||||
|
|
||||||
"@tiptap/extension-color@^2.0.3":
|
"@tiptap/extension-color@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-color/-/extension-color-2.24.0.tgz#a643a4dea7532a3bcc261465c8737f00d7ed29c6"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-color/-/extension-color-2.26.1.tgz#075386150a4457d03c85371a88205c838fc2bfae"
|
||||||
integrity sha512-I10tkIw0a4jD6Yu2AvUKZaPQVY83fx+DnC+Hd+eeQdT5JQy3c0K43N9HnPIPbtnpKFiJgOIJZhMy3LUXDPWSaA==
|
integrity sha512-lsPw3qpQNes1rHpxBtsV9XniN1dEjYd2nVTpQHGE4XLNwfE5+ejm6ySs8qVLM7+EXWcjANLLh4UA3zqkX6t6HA==
|
||||||
|
|
||||||
"@tiptap/extension-document@^2.24.0":
|
"@tiptap/extension-document@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.24.0.tgz#1c7e6d838b35ed5bad0ecd12712d7a0fa86f8378"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.26.1.tgz#3e65e4833fee138e5afaed4be586d75db10cb8b6"
|
||||||
integrity sha512-KNcYFEwmbgtsP8lHAPGpzRpUsp0sWDxsUW6vrozR+OSjOogx96OKz22NvJEgUQrVekjM6tKFp81vuIKWDo0EsA==
|
integrity sha512-2P2IZp1NRAE+21mRuFBiP3X2WKfZ6kUC23NJKpn8bcOamY3obYqCt0ltGPhE4eR8n8QAl2fI/3jIgjR07dC8ow==
|
||||||
|
|
||||||
"@tiptap/extension-dropcursor@^2.24.0":
|
"@tiptap/extension-dropcursor@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.24.0.tgz#9886f1d46a0dbdd518949373cdcfe10dff2c852b"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.26.1.tgz#2eff232f3ab50816ba7182275f84f475a88b4443"
|
||||||
integrity sha512-Oi3aNppt23U2POjowV6/6XtQG9LrMFqqun8LAAx3DItgkK3eqaEH5C39kZ75XpWpbPcZ7G+0+1qNOqU1ZyOFgg==
|
integrity sha512-JkDQU2ZYFOuT5mNYb8OiWGwD1HcjbtmX8tLNugQbToECmz9WvVPqJmn7V/q8VGpP81iEECz/IsyRmuf2kSD4uA==
|
||||||
|
|
||||||
"@tiptap/extension-floating-menu@^2.24.0":
|
"@tiptap/extension-floating-menu@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.24.0.tgz#87279b3e2356ed5f41878a73c74f92f0e68e435b"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.26.1.tgz#4be572fa98f356d44b1817cff5cd0db819f45c01"
|
||||||
integrity sha512-08T7cA6ILk9byvI0IMHv7MgINNx4fMUjn+1h4mX7k06rUR9P3nXEVQDQWcRZdqQ9orMdL44NtW8e+hGBZRHDQA==
|
integrity sha512-OJF+H6qhQogVTMedAGSWuoL1RPe3LZYXONuFCVyzHnvvMpK+BP1vm180E2zDNFnn/DVA+FOrzNGpZW7YjoFH1w==
|
||||||
dependencies:
|
dependencies:
|
||||||
tippy.js "^6.3.7"
|
tippy.js "^6.3.7"
|
||||||
|
|
||||||
"@tiptap/extension-gapcursor@^2.24.0":
|
"@tiptap/extension-gapcursor@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.24.0.tgz#7d28bdd9f8485a6fe10507795c95de549a95ae99"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.26.1.tgz#7a5ebd84d4495aa8403ececd1ace51d3ba9ab139"
|
||||||
integrity sha512-CG406JTLBFGyEQHKIygqIHtNrXz4TGy8bdlTDPihPrcstJMHC1oxE3TSYS34A73l0n0JvQCYioxppxIJLbGFVg==
|
integrity sha512-KOiMZc3PwJS3hR0nSq5d0TJi2jkNZkLZElcT6pCEnhRHzPH6dRMu9GM5Jj798ZRUy0T9UFcKJalFZaDxnmRnpg==
|
||||||
|
|
||||||
"@tiptap/extension-hard-break@^2.24.0":
|
"@tiptap/extension-hard-break@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.24.0.tgz#a714ffd2a7565f4eb98186535463a6cbbaecae0d"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.26.1.tgz#70226e2b63e2252a74f6e59b5c001a4c02e0c1e5"
|
||||||
integrity sha512-Zh7ML2kHpKNrDdu+NLqra6gQQyNspRz4vSAR28x9q31MatuWExM9RWocwDrLOe88AuYqOu5gDyMVZTi8ikVd9A==
|
integrity sha512-d6uStdNKi8kjPlHAyO59M6KGWATNwhLCD7dng0NXfwGndc22fthzIk/6j9F6ltQx30huy5qQram6j3JXwNACoA==
|
||||||
|
|
||||||
"@tiptap/extension-heading@^2.12.0", "@tiptap/extension-heading@^2.24.0":
|
"@tiptap/extension-heading@^2.12.0", "@tiptap/extension-heading@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.24.0.tgz#e16eded5fa34bd20771ed1788ed46c01fd68c363"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.26.1.tgz#49d1e8f2d10eb1c06bf348d7cb9d131097d65f78"
|
||||||
integrity sha512-qfrcn6QlOFxd0T4VMDloxzv7YUlOX5Cc/S60+7aRLUNMrByQyk+C1OwSdX3Wx6fYWhCszzFblTGTCWu5QijK/w==
|
integrity sha512-KSzL8WZV3pjJG9ke4RaU70+B5UlYR2S6olNt5UCAawM+fi11mobVztiBoC19xtpSVqIXC1AmXOqUgnuSvmE4ZA==
|
||||||
|
|
||||||
"@tiptap/extension-highlight@^2.0.3":
|
"@tiptap/extension-highlight@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.24.0.tgz#9bc3a7f0ffe99cb5d8f37ba49ead62d3932b2f7e"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.26.1.tgz#9c5aca076d146332930882c0fad7cbe47026c681"
|
||||||
integrity sha512-xRPcZR7ebHODvQobYJI5FDOd6UGguTHK7ez/wM7lKuVj5+VhmM/r5OBM68QZrZol5lYHcamfaIx4hmydCt4ecw==
|
integrity sha512-9eW2UqDqeAKSDIiL6SqcPSDCQAdU5qQmRMsJlShOM7Fu1aU71b1ewhUP9YioUCanciR99tqNsk/n3LAe0w5XdA==
|
||||||
|
|
||||||
"@tiptap/extension-history@^2.24.0":
|
"@tiptap/extension-history@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.24.0.tgz#2de5390fd2609b8e308198b3e5ba0642b9fbfdf0"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.26.1.tgz#de8e8a5ebf08cbbccb6dec11291128843a2d24e6"
|
||||||
integrity sha512-0FVeCm1O+W6PUFrcaHZ8wposZwSyrCOOPT894Mpam1hGdFr2V0RdqkgRYC94SSmZrkrDFJRklSVcpacjGFT6ig==
|
integrity sha512-m6YR1gkkauIDo3PRl0gP+7Oc4n5OqDzcjVh6LvWREmZP8nmi94hfseYbqOXUb6RPHIc0JKF02eiRifT4MSd2nw==
|
||||||
|
|
||||||
"@tiptap/extension-horizontal-rule@^2.24.0":
|
"@tiptap/extension-horizontal-rule@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.24.0.tgz#b7ac8914c8bf044ec43e9a94a3378c239b84d345"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.26.1.tgz#5c0c635d4444f38cb70e721d06fbe2d47a79982c"
|
||||||
integrity sha512-RGEAHTALSvN+m0zqtj+kdECJJs4F9O146fDgLXBvEFPqSyGd5fku1dM5r2LK4ECastir+N5Y+5Nas0ZXSoozIw==
|
integrity sha512-mT6baqOhs/NakgrAeDeed194E/ZJFGL692H0C7f1N7WDRaWxUu2oR0LrnRqSH5OyPjELkzu6nQnNy0+0tFGHHg==
|
||||||
|
|
||||||
"@tiptap/extension-image@^2.0.3":
|
"@tiptap/extension-image@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.24.0.tgz#eb75c849ba98f132d1b82e5bfe380a5c98bb06ba"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.26.1.tgz#1b71633f31a7c53c4570f94e1068ceb46fe93224"
|
||||||
integrity sha512-kcuPkCJBk+X7rAtdsQ2JVjCUhEZToOIQ54l7jBta4wsyZVKW3HNN3gGxikfF/8jnn8uZNuXCp0cN6wtmbccVOA==
|
integrity sha512-96+MaYBJebQlR/ik5W72GLUfXdEoxFs+6jsoERxbM5qEdhb7TEnodBFtWZOwgDO27kFd6rSNZuW9r5KJNtljEg==
|
||||||
|
|
||||||
"@tiptap/extension-italic@^2.24.0":
|
"@tiptap/extension-italic@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.24.0.tgz#ce928b98d45e1db26e45fe3c20256079a081175e"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.26.1.tgz#cd798d5e410d112f70aaea2c7eb30716f4a483c6"
|
||||||
integrity sha512-IW8TxvGTdi3FPDAdVkJCdMXUwwIagjrZO0qz0eTnM6nSX9hHXYrMQ3LyKHaXD5HTRBMLIqaokk8wQPkIMX4ruA==
|
integrity sha512-pOs6oU4LyGO89IrYE4jbE8ZYsPwMMIiKkYfXcfeD9NtpGNBnjeVXXF5I9ndY2ANrCAgC8k58C3/powDRf0T2yA==
|
||||||
|
|
||||||
"@tiptap/extension-link@^2.0.3":
|
"@tiptap/extension-link@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.24.0.tgz#9f46589919c53fdff9c6405bfabdeff4dffa87c8"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.26.1.tgz#8e479556b08aa42e2ac9369d45c30c281051a45a"
|
||||||
integrity sha512-J8kQI7xfT0Qaki1DeFhvZD1hWxkXmNmVzGRRz9ComrqIevaoXvZjI9aXyK2NkqjJB2xUxxu9JgcJIxUXbbBzfw==
|
integrity sha512-7yfum5Jymkue/uOSTQPt2SmkZIdZx7t3QhZLqBU7R9ettkdSCBgEGok6N+scJM1R1Zes+maSckLm0JZw5BKYNA==
|
||||||
dependencies:
|
dependencies:
|
||||||
linkifyjs "^4.2.0"
|
linkifyjs "^4.2.0"
|
||||||
|
|
||||||
"@tiptap/extension-list-item@^2.24.0":
|
"@tiptap/extension-list-item@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.24.0.tgz#93ca5a22160d94f7cda38e4a7f04e1eaeef4d245"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.26.1.tgz#932e041245d3a696c943e9d4a32cdf59cb386e88"
|
||||||
integrity sha512-ZS5I53ii7jgWPI9tCZG5p1z9LVYlt0wZ5f45epXQpcG0/P2HYscNCR7aJs/OmdOOjU/7bdpIqKR0BL7IlQca9Q==
|
integrity sha512-quOXckC73Luc3x+Dcm88YAEBW+Crh3x5uvtQOQtn2GEG91AshrvbnhGRiYnfvEN7UhWIS+FYI5liHFcRKSUKrQ==
|
||||||
|
|
||||||
"@tiptap/extension-mention@^2.0.3":
|
"@tiptap/extension-mention@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.24.0.tgz#1d0bcc2521012cc5c55d7e6efadb4b600c9bfcb3"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.26.1.tgz#f61a77f8b3dd99b12b9aac0a9ee8041f098b3986"
|
||||||
integrity sha512-532rfuN2fCnI4pWUTD94jBxzSF5TT61Afvq+ar5OKwcANf3G+PZm07ejUbVbHw+g/lKiEZLNLQbg07gIAAXpnA==
|
integrity sha512-sBrlJ9nWjFx7oWCtt0hV192FgCBXva1zwImWbgXTCGPAjv0d5EoPymIfRgoeanAmuQjOHoKzzZnJ6bELTZhkGw==
|
||||||
|
|
||||||
"@tiptap/extension-ordered-list@^2.24.0":
|
"@tiptap/extension-ordered-list@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.24.0.tgz#8048418afdd48a4a1d4ece887fb1783fd2efdaf0"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.26.1.tgz#81e60f4b679533b736ef0fbad4263a11e1c8465e"
|
||||||
integrity sha512-YxHDlkCI09Rb23weDEwmwLzXLhL30EW73brjHmFod9MCpDwDSkRWztsJRa6pVxcl0paiX7ftrM07ChbIgn84lw==
|
integrity sha512-UHKNRxq6TBnXMGFSq91knD6QaHsyyOwLOsXMzupmKM5Su0s+CRXEjfav3qKlbb9e4m7D7S/a0aPm8nC9KIXNhQ==
|
||||||
|
|
||||||
"@tiptap/extension-paragraph@^2.24.0":
|
"@tiptap/extension-paragraph@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.24.0.tgz#700af9e50f3bf01abba10461cebeecb5bc301440"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.26.1.tgz#2e25f9e72fd5b4b34ca8e9e3c355303d86eae055"
|
||||||
integrity sha512-es4HPZSlQneZOoZTE9aIXC7uWIZwkBh6EyC+dur7H23vtz3xECWW6/v1jJxhVZS+dVwuNaA04QGqsLeyRf1lnQ==
|
integrity sha512-UezvM9VDRAVJlX1tykgHWSD1g3MKfVMWWZ+Tg+PE4+kizOwoYkRWznVPgCAxjmyHajxpCKRXgqTZkOxjJ9Kjzg==
|
||||||
|
|
||||||
"@tiptap/extension-placeholder@^2.0.3":
|
"@tiptap/extension-placeholder@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-placeholder/-/extension-placeholder-2.24.0.tgz#0cd238de49114dc4c04032ad72d3bdcdd0338342"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-placeholder/-/extension-placeholder-2.26.1.tgz#a44280063978dfa86aad71dee6cad36c3a7862a0"
|
||||||
integrity sha512-/rfirea9xHh5d/uYSPFOzx/o909XrBNpunt3sYZNi4RWf/+79QEW54/O1cGLj/l8uhms3gL/Bn+Ksv5mvdSJlg==
|
integrity sha512-MBlqbkd+63btY7Qu+SqrXvWjPwooGZDsLTtl7jp52BczBl61cq9yygglt9XpM11TFMBdySgdLHBrLtQ0B7fBlw==
|
||||||
|
|
||||||
"@tiptap/extension-strike@^2.24.0":
|
"@tiptap/extension-strike@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.24.0.tgz#4a8e19ea1a23690a76b8620e9c46156c0d900cf0"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.26.1.tgz#d703acfa78455021082ccbac72b41ee9ab3f8c9b"
|
||||||
integrity sha512-nAhoy0korH+Vn0yOAdcKNJoDPzMAsyA7EgZYLQFCdWMnNBU6dTHJmRm6BI0Vhj3tqdXcnlavtPApBflW0eje3A==
|
integrity sha512-CkoRH+pAi6MgdCh7K0cVZl4N2uR4pZdabXAnFSoLZRSg6imLvEUmWHfSi1dl3Z7JOvd3a4yZ4NxerQn5MWbJ7g==
|
||||||
|
|
||||||
"@tiptap/extension-table-cell@^2.0.3":
|
"@tiptap/extension-table-cell@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.24.0.tgz#1a4425252597c9cad62349f87760dc054229c146"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.26.1.tgz#c204e9eef60f77063fc432faba4dd2ef2fe79ba3"
|
||||||
integrity sha512-RvHCKTqUzjeqOmqVqp9bdraQfGsDHGSazEgWdknsFi/0LGhkKSX9lsaqlUHQoSf1DRVNx4sq0B2qjrlyL9tB9w==
|
integrity sha512-0P5zY+WGFnULggJkX6+CevmFoBmVv1aUiBBXfcFuLG2mnUsS3QALQTowFtz/0/VbtbjzcOSStaGDHRJxPbk9XQ==
|
||||||
|
|
||||||
"@tiptap/extension-table-header@^2.0.3":
|
"@tiptap/extension-table-header@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.24.0.tgz#ddd5066b30f5fa0d7d76c97dde12387ed1db6137"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.26.1.tgz#1d9f2d609777201725ccd5850445d5e277a427fc"
|
||||||
integrity sha512-tI5m29locqOYN7w9XH96Zq9/O9jrp+PY0RurnSYotUErLvgnWMI++Fbm4aLpxA/wFqdMEZR3lrxR9zddli52Ew==
|
integrity sha512-SAwTW9H+sjVYjoeU5z8pVDMHn3r3FCi+zp2KAxsEsmujcd7qrQdY0cAjQtWjckCq6H3sQkbICa+xlCCd7C8ZAQ==
|
||||||
|
|
||||||
"@tiptap/extension-table-row@^2.0.3":
|
"@tiptap/extension-table-row@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.24.0.tgz#f8174465433631d0e492a6ecd548b139275bee08"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.26.1.tgz#40c85b430b18b89363cb59459f1992ecdac93fcd"
|
||||||
integrity sha512-ERKnkoZLWmGYWTCV8EqH8zGTvxp+aj/ojyQVdaP5Em59+D0dDenKwe58Dp046zeXejele0awIVqOulOfyon6hQ==
|
integrity sha512-c4oLrUfj1EVVDpbfKX36v7nnaeI4NxML2KRTQXocvcY65VCe0bPQh8ujpPgPcnKEzdWYdIuAX9RbEAkiYWe8Ww==
|
||||||
|
|
||||||
"@tiptap/extension-table@^2.0.3":
|
"@tiptap/extension-table@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.24.0.tgz#da3157cb9f2387ea40d8c44aabde31910b7e407a"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.26.1.tgz#26d45cd3f68def655c51c8ccbc6a3af507bdf49c"
|
||||||
integrity sha512-Ris3kuqUAsAkw8zqjUO8rMgDFFon3qVuXeHGJqNK3A2rEJzjM1DqgnqjL0Y06Gl7tbcOiVVrrzvHfELZ5Froiw==
|
integrity sha512-LQ63CK53qx2ZsbLTB4mUX0YCoGC0GbYQ82jS3kD+K7M/mb9MCkefvDk6rA8rXF8TjfGnv6o/Fseoot8uhH3qfg==
|
||||||
|
|
||||||
"@tiptap/extension-text-align@^2.0.3":
|
"@tiptap/extension-text-align@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-text-align/-/extension-text-align-2.24.0.tgz#d808535fdc32c87e0a9dd434ba591af65a03cda6"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-text-align/-/extension-text-align-2.26.1.tgz#79add5084d2b9ff1c347686834f924613d6c98cb"
|
||||||
integrity sha512-EnSB2437YITtZ4rNZfXxkPsLHysTa6gCLxIkP3B9GM0bPE/tqeY8n6M/Pt+9Ppqh+lDyU6jeywCu9vBvWLnVkg==
|
integrity sha512-x6mpNGELy2QtSPBoQqNgiXO9PjZoB+O2EAfXA9YRiBDSIRNOrw+7vOVpi+IgzswFmhMNgIYUVfQRud4FHUCNew==
|
||||||
|
|
||||||
"@tiptap/extension-text-style@^2.0.3", "@tiptap/extension-text-style@^2.24.0":
|
"@tiptap/extension-text-style@^2.0.3", "@tiptap/extension-text-style@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-text-style/-/extension-text-style-2.24.0.tgz#f5b498d2267a3a88fe40a4d26ec60b343fb2c453"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-text-style/-/extension-text-style-2.26.1.tgz#a6be329ff881df9da37d9a8c353b2b2e7b8508b3"
|
||||||
integrity sha512-SLMDatlJg421SLNGn4768WKXmTXWIiVCX2DWzzD+9XeoTFC2d6io1pveanQVsp3xVoUZtG9fi5uss0b9AWu6+w==
|
integrity sha512-t9Nc/UkrbCfnSHEUi1gvUQ2ZPzvfdYFT5TExoV2DTiUCkhG6+mecT5bTVFGW3QkPmbToL+nFhGn4ZRMDD0SP3Q==
|
||||||
|
|
||||||
"@tiptap/extension-text@^2.24.0":
|
"@tiptap/extension-text@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.24.0.tgz#d5b6b50a9f5154d746062b21d7f807a4fbf4a6e2"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.26.1.tgz#a51a11aa446d32b136851ce5173c89ad5ff0f57a"
|
||||||
integrity sha512-GYZmZ5nOlNFIvJZWzjm0SwqwppqWUG65lPp3j7AI9QEGmxGXUmCywTx06FH2/mYkzRaZ2eKhftfsSY1dEMM9yQ==
|
integrity sha512-p2n8WVMd/2vckdJlol24acaTDIZAhI7qle5cM75bn01sOEZoFlSw6SwINOULrUCzNJsYb43qrLEibZb4j2LeQw==
|
||||||
|
|
||||||
"@tiptap/extension-typography@^2.0.3":
|
"@tiptap/extension-typography@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/extension-typography/-/extension-typography-2.24.0.tgz#f9a65d41fe6cc0693ef3d3e812602d68a88c6405"
|
resolved "https://registry.yarnpkg.com/@tiptap/extension-typography/-/extension-typography-2.26.1.tgz#06ce74c0f3a5cf0a4b5ed3f8e1c00098a6d8dca1"
|
||||||
integrity sha512-r/Wm260Vcep/U3t3qiB2t5J/D6JrvXtzvbyEzLSPWA/gaA8q0UrSCWV8qGoSccPOlO+8BcFsAY7+dCcE1SApKQ==
|
integrity sha512-1zwKWfy7Tjutert1Vn/unN+98E0JFr5C2jx1xuesAEf4X405cQMb/zNMI44ON3xBG+aXZoTRlJuXNoYodeVSAg==
|
||||||
|
|
||||||
"@tiptap/pm@^2.0.3", "@tiptap/pm@^2.24.0":
|
"@tiptap/pm@^2.0.3", "@tiptap/pm@^2.26.1":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.24.0.tgz#414db0a5ab47d3e2decaa1a7dab6106b84e105a6"
|
resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.26.1.tgz#5e4bd79e60fe698fa12770b2845e5133b3333d06"
|
||||||
integrity sha512-rjvy3LmNweyDU/ttqQd+fi4A29KbcqNiQ/oWvzv7JNPS9bh4WmuSeWvlNfivo39hHXe46OQhzRVJrSAvyKp+wQ==
|
integrity sha512-8aF+mY/vSHbGFqyG663ds84b+vca5Lge3tHdTMTKazxCnhXR9dn2oQJMnZ78YZvdRbkPkMJJHti9h3K7u2UQvw==
|
||||||
dependencies:
|
dependencies:
|
||||||
prosemirror-changeset "^2.3.0"
|
prosemirror-changeset "^2.3.0"
|
||||||
prosemirror-collab "^1.3.1"
|
prosemirror-collab "^1.3.1"
|
||||||
@@ -970,44 +980,44 @@
|
|||||||
prosemirror-view "^1.37.0"
|
prosemirror-view "^1.37.0"
|
||||||
|
|
||||||
"@tiptap/starter-kit@^2.0.3":
|
"@tiptap/starter-kit@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.24.0.tgz#9a0cac55588baebe505e6b599bcb7d920cb8a3f6"
|
resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.26.1.tgz#00a19c05491a51423aabe511f624567942bd2baa"
|
||||||
integrity sha512-+JDcp/ao/oqWyVDVYCLXdx+3HjuL3Mh6uBXrfomj8z8XB+2vgigO9Plq1NG41Mfqk6QfzSRmjDB8yXhRVMF17Q==
|
integrity sha512-oziMGCds8SVQ3s5dRpBxVdEKZAmO/O//BjZ69mhA3q4vJdR0rnfLb5fTxSeQvHiqB878HBNn76kNaJrHrV35GA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@tiptap/core" "^2.24.0"
|
"@tiptap/core" "^2.26.1"
|
||||||
"@tiptap/extension-blockquote" "^2.24.0"
|
"@tiptap/extension-blockquote" "^2.26.1"
|
||||||
"@tiptap/extension-bold" "^2.24.0"
|
"@tiptap/extension-bold" "^2.26.1"
|
||||||
"@tiptap/extension-bullet-list" "^2.24.0"
|
"@tiptap/extension-bullet-list" "^2.26.1"
|
||||||
"@tiptap/extension-code" "^2.24.0"
|
"@tiptap/extension-code" "^2.26.1"
|
||||||
"@tiptap/extension-code-block" "^2.24.0"
|
"@tiptap/extension-code-block" "^2.26.1"
|
||||||
"@tiptap/extension-document" "^2.24.0"
|
"@tiptap/extension-document" "^2.26.1"
|
||||||
"@tiptap/extension-dropcursor" "^2.24.0"
|
"@tiptap/extension-dropcursor" "^2.26.1"
|
||||||
"@tiptap/extension-gapcursor" "^2.24.0"
|
"@tiptap/extension-gapcursor" "^2.26.1"
|
||||||
"@tiptap/extension-hard-break" "^2.24.0"
|
"@tiptap/extension-hard-break" "^2.26.1"
|
||||||
"@tiptap/extension-heading" "^2.24.0"
|
"@tiptap/extension-heading" "^2.26.1"
|
||||||
"@tiptap/extension-history" "^2.24.0"
|
"@tiptap/extension-history" "^2.26.1"
|
||||||
"@tiptap/extension-horizontal-rule" "^2.24.0"
|
"@tiptap/extension-horizontal-rule" "^2.26.1"
|
||||||
"@tiptap/extension-italic" "^2.24.0"
|
"@tiptap/extension-italic" "^2.26.1"
|
||||||
"@tiptap/extension-list-item" "^2.24.0"
|
"@tiptap/extension-list-item" "^2.26.1"
|
||||||
"@tiptap/extension-ordered-list" "^2.24.0"
|
"@tiptap/extension-ordered-list" "^2.26.1"
|
||||||
"@tiptap/extension-paragraph" "^2.24.0"
|
"@tiptap/extension-paragraph" "^2.26.1"
|
||||||
"@tiptap/extension-strike" "^2.24.0"
|
"@tiptap/extension-strike" "^2.26.1"
|
||||||
"@tiptap/extension-text" "^2.24.0"
|
"@tiptap/extension-text" "^2.26.1"
|
||||||
"@tiptap/extension-text-style" "^2.24.0"
|
"@tiptap/extension-text-style" "^2.26.1"
|
||||||
"@tiptap/pm" "^2.24.0"
|
"@tiptap/pm" "^2.26.1"
|
||||||
|
|
||||||
"@tiptap/suggestion@^2.0.3":
|
"@tiptap/suggestion@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.24.0.tgz#c1c96c67c07ab37899960a13aa7c3fae82dd8e9b"
|
resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.26.1.tgz#64b567443668ff9afb5533737f877e3604ab53ae"
|
||||||
integrity sha512-N0i4DwhdgAj87PqwENwV6K1HBAJ/4DLC1YKCO/CGyiqztUzzxhjS0TU8rWCMZDNqFeSuOx8oFbA0xwrU1FTiFw==
|
integrity sha512-iNWJdQN7h01keNoVwyCsdI7ZX11YkrexZjCnutWK17Dd72s3NYVTmQXu7saftwddT4nDdlczNxAFosrt0zMhcg==
|
||||||
|
|
||||||
"@tiptap/vue-3@^2.0.3":
|
"@tiptap/vue-3@^2.0.3":
|
||||||
version "2.24.0"
|
version "2.26.1"
|
||||||
resolved "https://registry.yarnpkg.com/@tiptap/vue-3/-/vue-3-2.24.0.tgz#98bae2f8338bbda86f25eec7458ba7878d7381b7"
|
resolved "https://registry.yarnpkg.com/@tiptap/vue-3/-/vue-3-2.26.1.tgz#6afb7aa4abfdad7432ead271c3448d23f233296e"
|
||||||
integrity sha512-2TnwAeEQR+EeduQQP4emY8y89KRzHbBQ/M0lTcjUseeAozmo5vfSI5XfwHYoXHQoKWZOlhYshCRrY93tENJwQA==
|
integrity sha512-GC0UP+v3KEb0nhgjIHYmWIn5ziTaRqSy8TESXOjG5aljJ8BdP+A0pbcpumB3u0QU+BLUANZqUV2r3l+V18AKYg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@tiptap/extension-bubble-menu" "^2.24.0"
|
"@tiptap/extension-bubble-menu" "^2.26.1"
|
||||||
"@tiptap/extension-floating-menu" "^2.24.0"
|
"@tiptap/extension-floating-menu" "^2.26.1"
|
||||||
|
|
||||||
"@types/estree@1.0.8":
|
"@types/estree@1.0.8":
|
||||||
version "1.0.8"
|
version "1.0.8"
|
||||||
@@ -1059,6 +1069,20 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz#525433c784aed9b457aaa0ee3d92aeb71f346b63"
|
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz#525433c784aed9b457aaa0ee3d92aeb71f346b63"
|
||||||
integrity sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==
|
integrity sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==
|
||||||
|
|
||||||
|
"@vexip-ui/hooks@^2.8.0":
|
||||||
|
version "2.9.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@vexip-ui/hooks/-/hooks-2.9.2.tgz#3c6ba9670f1a4ac4211b05279e18657a3c1921ba"
|
||||||
|
integrity sha512-zdwcTZUHYD/5aqndmUulyia4tPMI3FB09PUn674hZiQlkslO1KiH56WAI8R75wbvzPSmmhl5IA3VcbBZeaFEcw==
|
||||||
|
dependencies:
|
||||||
|
"@floating-ui/dom" "^1.7.0"
|
||||||
|
"@juggle/resize-observer" "^3.4.0"
|
||||||
|
"@vexip-ui/utils" "2.16.4"
|
||||||
|
|
||||||
|
"@vexip-ui/utils@2.16.4", "@vexip-ui/utils@^2.16.1":
|
||||||
|
version "2.16.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@vexip-ui/utils/-/utils-2.16.4.tgz#3429376a8f9e88040e969c21f14e70fe25d36127"
|
||||||
|
integrity sha512-KX+Q4EsuwDp6ZlRJ7OAkiYxu52D5CVM8zpqQz/FXYV+JUtzl9T3dvxgtA8gQ0wm5Sh/xT6jp8Wo4X7tLAzRh/A==
|
||||||
|
|
||||||
"@vitejs/plugin-vue@^5.0.3":
|
"@vitejs/plugin-vue@^5.0.3":
|
||||||
version "5.2.4"
|
version "5.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8"
|
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8"
|
||||||
@@ -1207,9 +1231,9 @@
|
|||||||
integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==
|
integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==
|
||||||
|
|
||||||
ace-builds@^1.36.2:
|
ace-builds@^1.36.2:
|
||||||
version "1.43.1"
|
version "1.43.2"
|
||||||
resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.43.1.tgz#96e7431e2ca821563c32f361298c7f899b6c516f"
|
resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.43.2.tgz#86d7d2f40317a547b7dd13ae862821d6b1e63f3e"
|
||||||
integrity sha512-n9/n+zBhbbkEJjU0FJ4wWAZBDl5G8WYzg4+uIjSER/U3wSSSSVo52W4sco4Jryg11JAJvorExxMr3GDINqtjdA==
|
integrity sha512-3wzJUJX0RpMc03jo0V8Q3bSb/cKPnS7Nqqw8fVHsCCHweKMiTIxT3fP46EhjmVy6MCuxwP801ere+RW245phGw==
|
||||||
|
|
||||||
acorn@^8.14.0, acorn@^8.14.1:
|
acorn@^8.14.0, acorn@^8.14.1:
|
||||||
version "8.15.0"
|
version "8.15.0"
|
||||||
@@ -1354,9 +1378,9 @@ camelcase-css@^2.0.1:
|
|||||||
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
|
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
|
||||||
|
|
||||||
caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001726:
|
caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001726:
|
||||||
version "1.0.30001726"
|
version "1.0.30001727"
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz#a15bd87d5a4bf01f6b6f70ae7c97fdfd28b5ae47"
|
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85"
|
||||||
integrity sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==
|
integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==
|
||||||
|
|
||||||
chalk@^4.1.0:
|
chalk@^4.1.0:
|
||||||
version "4.1.2"
|
version "4.1.2"
|
||||||
@@ -1451,9 +1475,9 @@ confbox@^0.2.2:
|
|||||||
integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==
|
integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==
|
||||||
|
|
||||||
core-js@^3.1.3, core-js@^3.26.1:
|
core-js@^3.1.3, core-js@^3.26.1:
|
||||||
version "3.43.0"
|
version "3.44.0"
|
||||||
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.43.0.tgz#f7258b156523208167df35dea0cfd6b6ecd4ee88"
|
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.44.0.tgz#db4fd4fa07933c1d6898c8b112a1119a9336e959"
|
||||||
integrity sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==
|
integrity sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==
|
||||||
|
|
||||||
crelt@^1.0.0, crelt@^1.0.5, crelt@^1.0.6:
|
crelt@^1.0.0, crelt@^1.0.5, crelt@^1.0.6:
|
||||||
version "1.0.6"
|
version "1.0.6"
|
||||||
@@ -1558,9 +1582,9 @@ echarts@^5.6.0:
|
|||||||
zrender "5.6.1"
|
zrender "5.6.1"
|
||||||
|
|
||||||
electron-to-chromium@^1.5.173:
|
electron-to-chromium@^1.5.173:
|
||||||
version "1.5.179"
|
version "1.5.183"
|
||||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz#453d53f360014a2604d40ccd41c4ea0a6e31b99a"
|
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.183.tgz#38c2e16910569b6c595bd16d1d39d1218bf0ffb6"
|
||||||
integrity sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==
|
integrity sha512-vCrDBYjQCAEefWGjlK3EpoSKfKbT10pR4XXPdn65q7snuNOZnthoVpBfZPykmDapOKfoD+MMIPG8ZjKyyc9oHA==
|
||||||
|
|
||||||
emoji-regex@^8.0.0:
|
emoji-regex@^8.0.0:
|
||||||
version "8.0.0"
|
version "8.0.0"
|
||||||
@@ -1698,10 +1722,10 @@ fraction.js@^4.3.7:
|
|||||||
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
|
resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
|
||||||
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
|
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
|
||||||
|
|
||||||
frappe-ui@^0.1.163:
|
frappe-ui@^0.1.172:
|
||||||
version "0.1.166"
|
version "0.1.173"
|
||||||
resolved "https://registry.yarnpkg.com/frappe-ui/-/frappe-ui-0.1.166.tgz#2664d9373b4751a39144c283be67f219c5eb99e3"
|
resolved "https://registry.yarnpkg.com/frappe-ui/-/frappe-ui-0.1.173.tgz#9d9bbfd841f776503a9e4d7614862cdaba6b5c4a"
|
||||||
integrity sha512-VSv2OE/JHa4ReOW0/9SafRzvQ6Dkxa1Bz6u58UU8FvagqpJVorQJlm2854LXuCk1IDV+uulPCr7uxiC8kwcjFw==
|
integrity sha512-imzCgMnVuOu+kzJJr++A/LmyuTCxOQC9i4zqIW9RO9eyv9yVH3U9TNdOjUwLymhBuDP/9Jas4X1Gb3asrlkLtg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@floating-ui/vue" "^1.1.6"
|
"@floating-ui/vue" "^1.1.6"
|
||||||
"@headlessui/vue" "^1.7.14"
|
"@headlessui/vue" "^1.7.14"
|
||||||
@@ -1734,6 +1758,7 @@ frappe-ui@^0.1.163:
|
|||||||
dompurify "^3.2.6"
|
dompurify "^3.2.6"
|
||||||
echarts "^5.6.0"
|
echarts "^5.6.0"
|
||||||
feather-icons "^4.28.0"
|
feather-icons "^4.28.0"
|
||||||
|
grid-layout-plus "^1.1.0"
|
||||||
highlight.js "^11.11.1"
|
highlight.js "^11.11.1"
|
||||||
idb-keyval "^6.2.0"
|
idb-keyval "^6.2.0"
|
||||||
lowlight "^3.3.0"
|
lowlight "^3.3.0"
|
||||||
@@ -1793,6 +1818,15 @@ globals@^15.14.0:
|
|||||||
resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8"
|
resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8"
|
||||||
integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==
|
integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==
|
||||||
|
|
||||||
|
grid-layout-plus@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/grid-layout-plus/-/grid-layout-plus-1.1.0.tgz#4c6610ff3aa39ddea2953861c224d1914bf5a33d"
|
||||||
|
integrity sha512-Q5uj0U5nx6xfHg8G1CDRJAEg+/40RVJl5jjRImcRwC78BxoJrEkTneT1pyxYMlbZ8fpGPT6QdHJQkD4+W6gt5A==
|
||||||
|
dependencies:
|
||||||
|
"@vexip-ui/hooks" "^2.8.0"
|
||||||
|
"@vexip-ui/utils" "^2.16.1"
|
||||||
|
interactjs "^1.10.27"
|
||||||
|
|
||||||
has-flag@^4.0.0:
|
has-flag@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
|
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
|
||||||
@@ -1825,6 +1859,13 @@ inherits@^2.0.3, inherits@^2.0.4:
|
|||||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||||
|
|
||||||
|
interactjs@^1.10.27:
|
||||||
|
version "1.10.27"
|
||||||
|
resolved "https://registry.yarnpkg.com/interactjs/-/interactjs-1.10.27.tgz#16499aba4987a5ccfdaddca7d1ba7bb1118e14d0"
|
||||||
|
integrity sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==
|
||||||
|
dependencies:
|
||||||
|
"@interactjs/types" "1.10.27"
|
||||||
|
|
||||||
is-binary-path@~2.1.0:
|
is-binary-path@~2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
|
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
|
||||||
@@ -2387,9 +2428,9 @@ prosemirror-menu@^1.2.4:
|
|||||||
prosemirror-state "^1.0.0"
|
prosemirror-state "^1.0.0"
|
||||||
|
|
||||||
prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.23.0, prosemirror-model@^1.25.0, prosemirror-model@^1.25.1:
|
prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.23.0, prosemirror-model@^1.25.0, prosemirror-model@^1.25.1:
|
||||||
version "1.25.1"
|
version "1.25.2"
|
||||||
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.25.1.tgz#aeae9f1ec79fcaa76f6fc619800d91fbcf726870"
|
resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.25.2.tgz#39ca862f76f354237efb94441dbc9f79e81cb247"
|
||||||
integrity sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==
|
integrity sha512-BVypCAJ4SL6jOiTsDffP3Wp6wD69lRhI4zg/iT8JXjp3ccZFiq5WyguxvMKmdKFC3prhaig7wSr8dneDToHE1Q==
|
||||||
dependencies:
|
dependencies:
|
||||||
orderedmap "^2.0.0"
|
orderedmap "^2.0.0"
|
||||||
|
|
||||||
@@ -2552,32 +2593,32 @@ reusify@^1.0.4:
|
|||||||
integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
|
integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
|
||||||
|
|
||||||
rollup@^4.20.0:
|
rollup@^4.20.0:
|
||||||
version "4.44.1"
|
version "4.45.0"
|
||||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.44.1.tgz#641723932894e7acbe6052aea34b8e72ef8b7c8f"
|
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.45.0.tgz#92d1b164eca1c6f2cb399ae7a1a8ee78967b6e33"
|
||||||
integrity sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==
|
integrity sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/estree" "1.0.8"
|
"@types/estree" "1.0.8"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@rollup/rollup-android-arm-eabi" "4.44.1"
|
"@rollup/rollup-android-arm-eabi" "4.45.0"
|
||||||
"@rollup/rollup-android-arm64" "4.44.1"
|
"@rollup/rollup-android-arm64" "4.45.0"
|
||||||
"@rollup/rollup-darwin-arm64" "4.44.1"
|
"@rollup/rollup-darwin-arm64" "4.45.0"
|
||||||
"@rollup/rollup-darwin-x64" "4.44.1"
|
"@rollup/rollup-darwin-x64" "4.45.0"
|
||||||
"@rollup/rollup-freebsd-arm64" "4.44.1"
|
"@rollup/rollup-freebsd-arm64" "4.45.0"
|
||||||
"@rollup/rollup-freebsd-x64" "4.44.1"
|
"@rollup/rollup-freebsd-x64" "4.45.0"
|
||||||
"@rollup/rollup-linux-arm-gnueabihf" "4.44.1"
|
"@rollup/rollup-linux-arm-gnueabihf" "4.45.0"
|
||||||
"@rollup/rollup-linux-arm-musleabihf" "4.44.1"
|
"@rollup/rollup-linux-arm-musleabihf" "4.45.0"
|
||||||
"@rollup/rollup-linux-arm64-gnu" "4.44.1"
|
"@rollup/rollup-linux-arm64-gnu" "4.45.0"
|
||||||
"@rollup/rollup-linux-arm64-musl" "4.44.1"
|
"@rollup/rollup-linux-arm64-musl" "4.45.0"
|
||||||
"@rollup/rollup-linux-loongarch64-gnu" "4.44.1"
|
"@rollup/rollup-linux-loongarch64-gnu" "4.45.0"
|
||||||
"@rollup/rollup-linux-powerpc64le-gnu" "4.44.1"
|
"@rollup/rollup-linux-powerpc64le-gnu" "4.45.0"
|
||||||
"@rollup/rollup-linux-riscv64-gnu" "4.44.1"
|
"@rollup/rollup-linux-riscv64-gnu" "4.45.0"
|
||||||
"@rollup/rollup-linux-riscv64-musl" "4.44.1"
|
"@rollup/rollup-linux-riscv64-musl" "4.45.0"
|
||||||
"@rollup/rollup-linux-s390x-gnu" "4.44.1"
|
"@rollup/rollup-linux-s390x-gnu" "4.45.0"
|
||||||
"@rollup/rollup-linux-x64-gnu" "4.44.1"
|
"@rollup/rollup-linux-x64-gnu" "4.45.0"
|
||||||
"@rollup/rollup-linux-x64-musl" "4.44.1"
|
"@rollup/rollup-linux-x64-musl" "4.45.0"
|
||||||
"@rollup/rollup-win32-arm64-msvc" "4.44.1"
|
"@rollup/rollup-win32-arm64-msvc" "4.45.0"
|
||||||
"@rollup/rollup-win32-ia32-msvc" "4.44.1"
|
"@rollup/rollup-win32-ia32-msvc" "4.45.0"
|
||||||
"@rollup/rollup-win32-x64-msvc" "4.44.1"
|
"@rollup/rollup-win32-x64-msvc" "4.45.0"
|
||||||
fsevents "~2.3.2"
|
fsevents "~2.3.2"
|
||||||
|
|
||||||
rope-sequence@^1.3.0:
|
rope-sequence@^1.3.0:
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
__version__ = "2.32.0"
|
__version__ = "2.33.0"
|
||||||
|
|||||||
@@ -21,7 +21,11 @@ app_license = "AGPL"
|
|||||||
# include js, css files in header of web template
|
# include js, css files in header of web template
|
||||||
web_include_css = "lms.bundle.css"
|
web_include_css = "lms.bundle.css"
|
||||||
# web_include_css = "/assets/lms/css/lms.css"
|
# web_include_css = "/assets/lms/css/lms.css"
|
||||||
web_include_js = []
|
web_include_js = [
|
||||||
|
"/assets/lms/js/eduvia_sso_login.js",
|
||||||
|
]
|
||||||
|
|
||||||
|
before_request = ["lms.integrations.eduvia_sso.try_sso_login"]
|
||||||
|
|
||||||
# include custom scss in every website theme (without file extension ".scss")
|
# include custom scss in every website theme (without file extension ".scss")
|
||||||
# website_theme_scss = "lms/public/scss/website"
|
# website_theme_scss = "lms/public/scss/website"
|
||||||
|
|||||||
9
lms/lms.iml
Normal file
9
lms/lms.iml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
@@ -16,13 +16,14 @@
|
|||||||
"field_order": [
|
"field_order": [
|
||||||
"title",
|
"title",
|
||||||
"video_link",
|
"video_link",
|
||||||
|
"tags",
|
||||||
"column_break_3",
|
"column_break_3",
|
||||||
"instructors",
|
"instructors",
|
||||||
"tags",
|
|
||||||
"column_break_htgn",
|
|
||||||
"image",
|
|
||||||
"category",
|
"category",
|
||||||
"status",
|
"status",
|
||||||
|
"column_break_htgn",
|
||||||
|
"image",
|
||||||
|
"card_gradient",
|
||||||
"section_break_7",
|
"section_break_7",
|
||||||
"published",
|
"published",
|
||||||
"published_on",
|
"published_on",
|
||||||
@@ -98,8 +99,7 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "image",
|
"fieldname": "image",
|
||||||
"fieldtype": "Attach Image",
|
"fieldtype": "Attach Image",
|
||||||
"label": "Preview Image",
|
"label": "Preview Image"
|
||||||
"reqd": 1
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "tags",
|
"fieldname": "tags",
|
||||||
@@ -272,6 +272,12 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Evaluator",
|
"label": "Evaluator",
|
||||||
"options": "Course Evaluator"
|
"options": "Course Evaluator"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "card_gradient",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"label": "Color",
|
||||||
|
"options": "Red\nBlue\nGreen\nAmber\nCyan\nOrange\nPink\nPurple\nTeal\nViolet\nYellow\nGray"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"is_published_field": "published",
|
"is_published_field": "published",
|
||||||
@@ -290,8 +296,8 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"make_attachments_public": 1,
|
"make_attachments_public": 1,
|
||||||
"modified": "2025-05-29 12:38:01.002898",
|
"modified": "2025-07-25 17:50:44.983391",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "sayali@frappe.io",
|
||||||
"module": "LMS",
|
"module": "LMS",
|
||||||
"name": "LMS Course",
|
"name": "LMS Course",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ class LMSCourse(Document):
|
|||||||
self.validate_certification()
|
self.validate_certification()
|
||||||
self.validate_amount_and_currency()
|
self.validate_amount_and_currency()
|
||||||
self.image = validate_image(self.image)
|
self.image = validate_image(self.image)
|
||||||
|
self.validate_card_gradient()
|
||||||
|
|
||||||
def validate_published(self):
|
def validate_published(self):
|
||||||
if self.published and not self.published_on:
|
if self.published and not self.published_on:
|
||||||
@@ -73,6 +74,24 @@ class LMSCourse(Document):
|
|||||||
if self.paid_certificate and (cint(self.course_price) <= 0 or not self.currency):
|
if self.paid_certificate and (cint(self.course_price) <= 0 or not self.currency):
|
||||||
frappe.throw(_("Amount and currency are required for paid certificates."))
|
frappe.throw(_("Amount and currency are required for paid certificates."))
|
||||||
|
|
||||||
|
def validate_card_gradient(self):
|
||||||
|
if not self.image and not self.card_gradient:
|
||||||
|
colors = [
|
||||||
|
"Red",
|
||||||
|
"Blue",
|
||||||
|
"Green",
|
||||||
|
"Yellow",
|
||||||
|
"Orange",
|
||||||
|
"Pink",
|
||||||
|
"Amber",
|
||||||
|
"Violet",
|
||||||
|
"Cyan",
|
||||||
|
"Teal",
|
||||||
|
"Gray",
|
||||||
|
"Purple",
|
||||||
|
]
|
||||||
|
self.card_gradient = random.choice(colors)
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
if not self.upcoming and self.has_value_changed("upcoming"):
|
if not self.upcoming and self.has_value_changed("upcoming"):
|
||||||
self.send_email_to_interested_users()
|
self.send_email_to_interested_users()
|
||||||
|
|||||||
@@ -565,10 +565,13 @@ def get_courses_under_review():
|
|||||||
|
|
||||||
def validate_image(path):
|
def validate_image(path):
|
||||||
if path and "/private" in path:
|
if path and "/private" in path:
|
||||||
file = frappe.get_doc("File", {"file_url": path})
|
frappe.db.set_value(
|
||||||
file.is_private = 0
|
"File",
|
||||||
file.save()
|
{"file_url": path},
|
||||||
return file.file_url
|
"is_private",
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
return path.replace("/private", "")
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
@@ -1097,6 +1100,7 @@ def get_course_fields():
|
|||||||
"title",
|
"title",
|
||||||
"tags",
|
"tags",
|
||||||
"image",
|
"image",
|
||||||
|
"card_gradient",
|
||||||
"short_introduction",
|
"short_introduction",
|
||||||
"published",
|
"published",
|
||||||
"upcoming",
|
"upcoming",
|
||||||
|
|||||||
768
lms/locale/ar.po
768
lms/locale/ar.po
File diff suppressed because it is too large
Load Diff
772
lms/locale/bs.po
772
lms/locale/bs.po
File diff suppressed because it is too large
Load Diff
768
lms/locale/cs.po
768
lms/locale/cs.po
File diff suppressed because it is too large
Load Diff
768
lms/locale/de.po
768
lms/locale/de.po
File diff suppressed because it is too large
Load Diff
771
lms/locale/eo.po
771
lms/locale/eo.po
File diff suppressed because it is too large
Load Diff
768
lms/locale/es.po
768
lms/locale/es.po
File diff suppressed because it is too large
Load Diff
772
lms/locale/fa.po
772
lms/locale/fa.po
File diff suppressed because it is too large
Load Diff
2703
lms/locale/fr.po
2703
lms/locale/fr.po
File diff suppressed because it is too large
Load Diff
772
lms/locale/hr.po
772
lms/locale/hr.po
File diff suppressed because it is too large
Load Diff
780
lms/locale/hu.po
780
lms/locale/hu.po
File diff suppressed because it is too large
Load Diff
7434
lms/locale/id.po
Normal file
7434
lms/locale/id.po
Normal file
File diff suppressed because it is too large
Load Diff
768
lms/locale/it.po
768
lms/locale/it.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
768
lms/locale/nl.po
768
lms/locale/nl.po
File diff suppressed because it is too large
Load Diff
768
lms/locale/pl.po
768
lms/locale/pl.po
File diff suppressed because it is too large
Load Diff
770
lms/locale/pt.po
770
lms/locale/pt.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
768
lms/locale/ru.po
768
lms/locale/ru.po
File diff suppressed because it is too large
Load Diff
775
lms/locale/sr.po
775
lms/locale/sr.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
774
lms/locale/sv.po
774
lms/locale/sv.po
File diff suppressed because it is too large
Load Diff
778
lms/locale/th.po
778
lms/locale/th.po
File diff suppressed because it is too large
Load Diff
768
lms/locale/tr.po
768
lms/locale/tr.po
File diff suppressed because it is too large
Load Diff
768
lms/locale/vi.po
768
lms/locale/vi.po
File diff suppressed because it is too large
Load Diff
772
lms/locale/zh.po
772
lms/locale/zh.po
File diff suppressed because it is too large
Load Diff
96
lms/public/js/eduvia_sso_login.js
Normal file
96
lms/public/js/eduvia_sso_login.js
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
// ajoute le bouton que sur la page de login - s'il n'y en a pas deja
|
||||||
|
if (!location.pathname.includes('/login')) return;
|
||||||
|
|
||||||
|
const target =
|
||||||
|
document.querySelector('.page-card .page-card-actions') ||
|
||||||
|
document.querySelector('form#login_form') ||
|
||||||
|
document.querySelector('.page-card');
|
||||||
|
|
||||||
|
if (!target || document.getElementById('eduvia-login-btn')) return;
|
||||||
|
|
||||||
|
const btn = document.createElement('a');
|
||||||
|
btn.id = 'eduvia-login-btn';
|
||||||
|
btn.className = 'btn btn-primary btn-block mt-3';
|
||||||
|
btn.innerText = 'Se connecter avec Eduvia';
|
||||||
|
btn.href = '#';
|
||||||
|
|
||||||
|
const insertIntoForm = (container) => {
|
||||||
|
if (container && container.tagName && container.tagName.toLowerCase() === 'form') {
|
||||||
|
const wrap = document.createElement('div');
|
||||||
|
wrap.className = 'mt-3';
|
||||||
|
wrap.appendChild(btn);
|
||||||
|
container.appendChild(wrap);
|
||||||
|
} else {
|
||||||
|
target.appendChild(btn);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
insertIntoForm(target);
|
||||||
|
|
||||||
|
btn.addEventListener(
|
||||||
|
'click',
|
||||||
|
async (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
if (btn.dataset.loading === '1') return;
|
||||||
|
|
||||||
|
// Recupere user/pass depuis le formulaire s'ils existent -sinon prompt()
|
||||||
|
const emailEl =
|
||||||
|
document.querySelector('#login_email') ||
|
||||||
|
document.querySelector('input[name="login_email"]') ||
|
||||||
|
document.querySelector('input[type="email"]');
|
||||||
|
|
||||||
|
const passEl =
|
||||||
|
document.querySelector('#login_password') ||
|
||||||
|
document.querySelector('input[name="login_password"]') ||
|
||||||
|
document.querySelector('input[type="password"]');
|
||||||
|
|
||||||
|
const user =
|
||||||
|
(emailEl && emailEl.value && emailEl.value.trim()) ||
|
||||||
|
(typeof prompt === 'function' ? prompt('Utilisateur Eduvia') : '');
|
||||||
|
|
||||||
|
if (!user) return;
|
||||||
|
|
||||||
|
const password =
|
||||||
|
(passEl && passEl.value) ||
|
||||||
|
(typeof prompt === 'function' ? prompt('Mot de passe Eduvia') : '');
|
||||||
|
|
||||||
|
if (password == null) return;
|
||||||
|
|
||||||
|
const form = new FormData();
|
||||||
|
form.set('user', user);
|
||||||
|
form.set('password', password);
|
||||||
|
|
||||||
|
const originalText = btn.innerText;
|
||||||
|
btn.dataset.loading = '1';
|
||||||
|
btn.innerText = 'Connexion en cours...';
|
||||||
|
btn.classList.add('disabled');
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch('/api/method/lms.lms.api.eduvia_proxy_login', {
|
||||||
|
method: 'POST',
|
||||||
|
body: form,
|
||||||
|
credentials: 'include',
|
||||||
|
});
|
||||||
|
|
||||||
|
// Frappe renvoie { message: {...} }
|
||||||
|
const payload = await res.json().catch(() => ({}));
|
||||||
|
const msg = payload && (payload.message || payload);
|
||||||
|
|
||||||
|
if (res.ok && msg && msg.success) {
|
||||||
|
// Connecte: redirige vers la home (ou recharge)
|
||||||
|
window.location.assign('/');
|
||||||
|
} else {
|
||||||
|
alert((msg && msg.error) || 'Login Eduvia échoué');
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
alert('Erreur réseau');
|
||||||
|
} finally {
|
||||||
|
btn.dataset.loading = '';
|
||||||
|
btn.innerText = originalText;
|
||||||
|
btn.classList.remove('disabled');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
true
|
||||||
|
);
|
||||||
|
});
|
||||||
372
lms/translations/fr.csv
Normal file
372
lms/translations/fr.csv
Normal file
@@ -0,0 +1,372 @@
|
|||||||
|
"Courses","Cours"
|
||||||
|
"Batches","Sessions"
|
||||||
|
"Certified Members","Membres certifiés"
|
||||||
|
"Jobs","Offres"
|
||||||
|
"Statistics","Statistiques"
|
||||||
|
"Programs","Programmes"
|
||||||
|
"Programming Exercises","Exercices de programmation"
|
||||||
|
"Assignments","Devoirs"
|
||||||
|
"Quizzes","Quiz"
|
||||||
|
"More","Plus"
|
||||||
|
"Expand","Développer"
|
||||||
|
"Collapse","Réduire"
|
||||||
|
"Help","Aide"
|
||||||
|
"Powered by Learning","Propulsé par Learning"
|
||||||
|
"Learning","Learning"
|
||||||
|
"Details","Détails"
|
||||||
|
"Assessments","Évaluations"
|
||||||
|
"Discussions","Discussions"
|
||||||
|
"People","Personnes"
|
||||||
|
"Certification","Certification"
|
||||||
|
"Course Outline","Plan du cours"
|
||||||
|
"Average Rating","Note moyenne"
|
||||||
|
"Enrolled Students","Étudiants inscrits"
|
||||||
|
"Zen Mode","Mode Zen"
|
||||||
|
"Video Statistics","Statistiques vidéo"
|
||||||
|
"This lesson is locked","Cette leçon est verrouillée"
|
||||||
|
"This lesson is not available for preview. Please enroll in the course to access it.","Cette leçon n’est pas disponible en aperçu. Veuillez vous inscrire au cours pour y accéder."
|
||||||
|
"Start Learning","Commencer l'apprentissage"
|
||||||
|
"Contact the Administrator to enroll for this course.","Contactez l’administrateur pour vous inscrire à ce cours."
|
||||||
|
"Login","Se connecter"
|
||||||
|
"completed","terminé"
|
||||||
|
"Previous","Précédent"
|
||||||
|
"Edit","Modifier"
|
||||||
|
"Next","Suivant"
|
||||||
|
"Back to Course","Retour au cours"
|
||||||
|
"Instructor Notes","Notes du formateur"
|
||||||
|
"Certification","Certification"
|
||||||
|
"You are already certified for this course. Click on the card below to open your certificate.","Vous êtes déjà certifié pour ce cours. Cliquez sur la carte ci-dessous pour ouvrir votre certificat."
|
||||||
|
"Issued On","Délivré le"
|
||||||
|
"Issued on","Délivré le"
|
||||||
|
"{0} Open Jobs","{0} offres ouvertes"
|
||||||
|
"New Job","Nouvelle offre"
|
||||||
|
"Search","Rechercher"
|
||||||
|
"Country","Pays"
|
||||||
|
"Type","Type"
|
||||||
|
"Full Time","Temps plein"
|
||||||
|
"Part Time","Temps partiel"
|
||||||
|
"Contract","Contrat"
|
||||||
|
"Freelance","Freelance"
|
||||||
|
"Jobs","Offres"
|
||||||
|
"No results found","Aucun résultat"
|
||||||
|
"Delete","Supprimer"
|
||||||
|
"Add Row","Ajouter une ligne"
|
||||||
|
"Add","Ajouter"
|
||||||
|
"Save","Enregistrer"
|
||||||
|
"Submit","Envoyer"
|
||||||
|
"Create","Créer"
|
||||||
|
"Post","Publier"
|
||||||
|
"No Recording","Pas d’enregistrement"
|
||||||
|
"Local","Local"
|
||||||
|
"Cloud","Cloud"
|
||||||
|
"PDF","PDF"
|
||||||
|
"Image","Image"
|
||||||
|
"Document","Document"
|
||||||
|
"Text","Texte"
|
||||||
|
"URL","URL"
|
||||||
|
"Quiz","Quiz"
|
||||||
|
"Assignment","Devoir"
|
||||||
|
"Programming Exercise","Exercice de programmation"
|
||||||
|
"Add a new member","Ajouter un nouveau membre"
|
||||||
|
"Add Evaluator","Ajouter un évaluateur"
|
||||||
|
"Evaluator added successfully","Évaluateur ajouté avec succès"
|
||||||
|
"Evaluator deleted successfully","Évaluateur supprimé avec succès"
|
||||||
|
"Email","Adresse e-mail"
|
||||||
|
"First Name","Prénom"
|
||||||
|
"Load More","Charger plus"
|
||||||
|
"Student","Étudiant"
|
||||||
|
"Moderator","Modérateur"
|
||||||
|
"Evaluator","Évaluateur"
|
||||||
|
"Mark all as read","Tout marquer comme lu"
|
||||||
|
"Unread","Non lus"
|
||||||
|
"Read","Lus"
|
||||||
|
"View","Voir"
|
||||||
|
"Nothing to see here.","Rien à afficher."
|
||||||
|
"Not Permitted","Non autorisé"
|
||||||
|
"You are not a member of this batch. Please checkout our upcoming batches.","Vous n’êtes pas membre de cette session. Veuillez consulter nos sessions à venir."
|
||||||
|
"Please login to access this page.","Veuillez vous connecter pour accéder à cette page."
|
||||||
|
"Upcoming Batches","Sessions à venir"
|
||||||
|
"Assignment","Devoir"
|
||||||
|
"Member","Membre"
|
||||||
|
"Submitted","Soumis"
|
||||||
|
"Status","Statut"
|
||||||
|
"Pass","Réussi"
|
||||||
|
"Fail","Échoué"
|
||||||
|
"Not Graded","Non noté"
|
||||||
|
"No submissions","Aucune soumission"
|
||||||
|
"There are no submissions for this assignment.","Il n’y a aucune soumission pour ce devoir."
|
||||||
|
"You will have to complete the quiz to continue the video","Vous devrez terminer le quiz pour continuer la vidéo"
|
||||||
|
"This quiz consists of {0} questions.","Ce quiz comporte {0} questions."
|
||||||
|
"Please ensure that you complete all the questions in {0} minutes.","Veuillez vous assurer de terminer toutes les questions en {0} minutes."
|
||||||
|
"If you fail to do so, the quiz will be automatically submitted when the timer ends.","À défaut, le quiz sera automatiquement soumis à la fin du minuteur."
|
||||||
|
"You will have to get {0}% correct answers in order to pass the quiz.","Vous devrez obtenir {0}% de bonnes réponses pour réussir le quiz."
|
||||||
|
"You can attempt this quiz {0}.","Vous pouvez tenter ce quiz {0}."
|
||||||
|
"Time","Temps"
|
||||||
|
"Start the Quiz","Commencer le quiz"
|
||||||
|
"Start","Démarrer"
|
||||||
|
"Resume Video","Reprendre la vidéo"
|
||||||
|
"You have already exceeded the maximum number of attempts allowed for this quiz.","Vous avez déjà dépassé le nombre maximal de tentatives autorisées pour ce quiz."
|
||||||
|
"Question {0}","Question {0}"
|
||||||
|
"Mark","Point"
|
||||||
|
"Marks","Points"
|
||||||
|
"Question {0} of {1}","Question {0} sur {1}"
|
||||||
|
"Check","Vérifier"
|
||||||
|
"Submit","Soumettre"
|
||||||
|
"Next","Suivant"
|
||||||
|
"Quiz Summary","Récapitulatif du quiz"
|
||||||
|
"Your submission has been successfully saved. The instructor will review and grade it shortly, and you'll be notified of your final result.","Votre soumission a bien été enregistrée. Le formateur l’examinera et la notera prochainement ; vous serez informé du résultat final."
|
||||||
|
"You got {0}% correct answers with a score of {1} out of {2}","Vous avez {0}% de bonnes réponses avec un score de {1} sur {2}"
|
||||||
|
"Try Again","Réessayer"
|
||||||
|
"No Quiz submissions found","Aucune soumission de quiz trouvée"
|
||||||
|
"Choose all answers that apply","Choisissez toutes les réponses correctes"
|
||||||
|
"Choose one answer","Choisissez une réponse"
|
||||||
|
"Type your answer","Saisissez votre réponse"
|
||||||
|
"Please select an option","Veuillez sélectionner une option"
|
||||||
|
"Correct","Correct"
|
||||||
|
"Incorrect","Incorrect"
|
||||||
|
"Settings","Paramètres"
|
||||||
|
"Programming Exercises","Exercices de programmation"
|
||||||
|
"Certified Members","Membres certifiés"
|
||||||
|
"Statistics","Statistiques"
|
||||||
|
"Meta Description","Méta‑description"
|
||||||
|
"Meta Keywords","Mots‑clés"
|
||||||
|
"Meta Image","Image méta"
|
||||||
|
"This site is being updated. You will not be able to make any changes. Full access will be restored shortly.","Ce site est en cours de mise à jour. Vous ne pourrez pas effectuer de modifications. L’accès complet sera rétabli sous peu."
|
||||||
|
"Introduction","Introduction"
|
||||||
|
"Setting up","Mise en place"
|
||||||
|
"Creating a course","Créer un cours"
|
||||||
|
"Create a course","Créer un cours"
|
||||||
|
"Add a chapter","Ajouter un chapitre"
|
||||||
|
"Add a lesson","Ajouter une leçon"
|
||||||
|
"Creating a batch","Créer une session"
|
||||||
|
"Create a batch","Créer une session"
|
||||||
|
"Create a live class","Créer un cours en direct"
|
||||||
|
"Assessments","Évaluations"
|
||||||
|
"Quizzes","Quiz"
|
||||||
|
"Assignments","Devoirs"
|
||||||
|
"Certification","Certification"
|
||||||
|
"Issue a Certificate","Émettre un certificat"
|
||||||
|
"Custom Certificate Templates","Modèles de certificat personnalisés"
|
||||||
|
"Monetization","Monétisation"
|
||||||
|
"Setting up payment gateway","Configuration de la passerelle de paiement"
|
||||||
|
"Roles","Rôles"
|
||||||
|
"Create your first course","Créez votre premier cours"
|
||||||
|
"Add your first chapter","Ajoutez votre premier chapitre"
|
||||||
|
"Add your first lesson","Ajoutez votre première leçon"
|
||||||
|
"Create your first quiz","Créez votre premier quiz"
|
||||||
|
"Invite your team and students","Invitez votre équipe et vos étudiants"
|
||||||
|
"Create your first batch","Créez votre première session"
|
||||||
|
"Add students to your batch","Ajoutez des étudiants à votre session"
|
||||||
|
"Add courses to your batch","Ajoutez des cours à votre session"
|
||||||
|
"Only image file is allowed.","Seuls les fichiers image sont autorisés."
|
||||||
|
"Failed to update meta tags {0}","Échec de la mise à jour des méta‑balises {0}"
|
||||||
|
"Courses deleted successfully","Cours supprimés avec succès"
|
||||||
|
"No courses added","Aucun cours ajouté"
|
||||||
|
"Course","Cours"
|
||||||
|
"All Courses","Tous les cours"
|
||||||
|
"Instructors","Formateurs"
|
||||||
|
"Completed","Terminé"
|
||||||
|
"Enrolled","Inscrits"
|
||||||
|
"Get Certified","Obtenir la certification"
|
||||||
|
"Reviews","Avis"
|
||||||
|
"Write a review","Rédiger un avis"
|
||||||
|
"Review the course","Évaluer le cours"
|
||||||
|
"Help us improve our course material.","Aidez-nous à améliorer le contenu du cours."
|
||||||
|
"Add Chapter","Ajouter un chapitre"
|
||||||
|
"Add Lesson","Ajouter une leçon"
|
||||||
|
"Questions","Questions"
|
||||||
|
"Notify me when available","Me prévenir lorsqu’il sera disponible"
|
||||||
|
"Continue Learning","Continuer l’apprentissage"
|
||||||
|
"Get Certificate","Obtenir le certificat"
|
||||||
|
"Slots","Créneaux"
|
||||||
|
"This lesson is not available for preview. Please join the course to access it.","Cette leçon n’est pas disponible en aperçu. Veuillez rejoindre le cours pour y accéder."
|
||||||
|
"Cancel","Annuler"
|
||||||
|
"others","autres"
|
||||||
|
"Course List","Liste des cours"
|
||||||
|
"Headline","Titre"
|
||||||
|
"Upcoming","À venir"
|
||||||
|
"Live","En direct"
|
||||||
|
"Created","Créé"
|
||||||
|
"Category","Catégorie"
|
||||||
|
"Search by Title","Rechercher par titre"
|
||||||
|
"Generate Certificates","Générer les certificats"
|
||||||
|
"Make an Announcement","Faire une annonce"
|
||||||
|
"About this batch","À propos de cette session"
|
||||||
|
"Create a Live Class","Créer un cours en direct"
|
||||||
|
"Title","Titre"
|
||||||
|
"Date","Date"
|
||||||
|
"Duration of the live class in minutes","Durée du cours en direct en minutes"
|
||||||
|
"Duration","Durée"
|
||||||
|
"Time","Heure"
|
||||||
|
"Timezone","Fuseau horaire"
|
||||||
|
"Auto Recording","Enregistrement automatique"
|
||||||
|
"Description","Description"
|
||||||
|
"Please enter a title.","Veuillez saisir un titre."
|
||||||
|
"Please select a date.","Veuillez sélectionner une date."
|
||||||
|
"Please select a time.","Veuillez sélectionner une heure."
|
||||||
|
"Please select a timezone.","Veuillez sélectionner un fuseau horaire."
|
||||||
|
"Please enter a valid time in the format HH:mm.","Veuillez saisir une heure valide au format HH:mm."
|
||||||
|
"Please select a future date and time.","Veuillez sélectionner une date et une heure futures."
|
||||||
|
"Please select a duration.","Veuillez sélectionner une durée."
|
||||||
|
"Create an Assignment","Créer un devoir"
|
||||||
|
"Edit Assignment","Modifier le devoir"
|
||||||
|
"Submission Type","Type de soumission"
|
||||||
|
"Question","Question"
|
||||||
|
"Check Submissions","Voir les soumissions"
|
||||||
|
"Assignment created successfully","Devoir créé avec succès"
|
||||||
|
"Assignment updated successfully","Devoir mis à jour avec succès"
|
||||||
|
"Add an assessment","Ajouter une évaluation"
|
||||||
|
"Assessment","Évaluation"
|
||||||
|
"Assessment added successfully","Évaluation ajoutée avec succès"
|
||||||
|
"Discard","Annuler"
|
||||||
|
"Submission by","Soumission par"
|
||||||
|
"Submission","Soumission"
|
||||||
|
"Not Saved","Non enregistré"
|
||||||
|
"Feel free to make edits to your submission if needed.","N’hésitez pas à modifier votre soumission si nécessaire."
|
||||||
|
"Add your assignment as {0}","Ajoutez votre devoir en tant que {0}"
|
||||||
|
"Uploading {0}%","Téléversement {0}%"
|
||||||
|
"Upload File","Téléverser un fichier"
|
||||||
|
"Enter a URL","Saisir une URL"
|
||||||
|
"Write your answer here","Écrivez votre réponse ici"
|
||||||
|
"Comments by Evaluator","Commentaires de l’évaluateur"
|
||||||
|
"Grading","Notation"
|
||||||
|
"Grade","Note"
|
||||||
|
"Comments","Commentaires"
|
||||||
|
"Assignment submitted successfully","Devoir soumis avec succès"
|
||||||
|
"Students","Étudiants"
|
||||||
|
"Certified","Certifiés"
|
||||||
|
"Batch Summary","Récapitulatif de la session"
|
||||||
|
"Progress of students in courses and assessments","Progression des étudiants dans les cours et évaluations"
|
||||||
|
"Number of Students","Nombre d’étudiants"
|
||||||
|
"There are no students in this batch.","Il n’y a aucun étudiant dans cette session."
|
||||||
|
"Students deleted successfully","Étudiants supprimés avec succès"
|
||||||
|
"No Assessments","Aucune évaluation"
|
||||||
|
"Status/Percentage","Statut/Pourcentage"
|
||||||
|
"Create a Quiz","Créer un quiz"
|
||||||
|
"No Quizzes","Aucun quiz"
|
||||||
|
"Published Courses","Cours publiés"
|
||||||
|
"Active Members","Membres actifs"
|
||||||
|
"Course Enrollments","Inscriptions aux cours"
|
||||||
|
"Course Completions","Cours terminés"
|
||||||
|
"Add Chapter","Ajouter un chapitre"
|
||||||
|
"Add Lesson","Ajouter une leçon"
|
||||||
|
"Login to Frappe Cloud?","Se connecter à Frappe Cloud ?"
|
||||||
|
"Are you sure you want to login to your Frappe Cloud dashboard?","Voulez‑vous vraiment vous connecter à votre tableau de bord Frappe Cloud ?"
|
||||||
|
"Confirm","Confirmer"
|
||||||
|
"New","Nouveau"
|
||||||
|
"Edit Profile","Modifier le profil"
|
||||||
|
"About","À propos"
|
||||||
|
"Certificates","Certificats"
|
||||||
|
"Roles","Rôles"
|
||||||
|
"Assignment Submissions","Soumissions de devoirs"
|
||||||
|
"Login to Frappe Cloud","Se connecter à Frappe Cloud"
|
||||||
|
"Login to Frappe Cloud?","Se connecter à Frappe Cloud ?"
|
||||||
|
"Are you sure you want to login to your Frappe Cloud dashboard?","Voulez‑vous vraiment vous connecter à votre tableau de bord Frappe Cloud ?"
|
||||||
|
"Log out","Se déconnecter"
|
||||||
|
"Log in","Se connecter"
|
||||||
|
"Problem Statement","Énoncé du problème"
|
||||||
|
"Run","Exécuter"
|
||||||
|
"Compiler Message","Message du compilateur"
|
||||||
|
"Test Cases","Cas de test"
|
||||||
|
"Test {0}","Test {0}"
|
||||||
|
"Input","Entrée"
|
||||||
|
"Your Output","Votre sortie"
|
||||||
|
"Expected Output","Sortie attendue"
|
||||||
|
"Please run the code to execute the test cases.","Veuillez exécuter le code pour lancer les cas de test."
|
||||||
|
"Check All Submissions","Voir toutes les soumissions"
|
||||||
|
"Check Submission","Voir la soumission"
|
||||||
|
"Program Courses","Cours du programme"
|
||||||
|
"Program Members","Membres du programme"
|
||||||
|
"ID","ID"
|
||||||
|
"Full Name","Nom complet"
|
||||||
|
"Progress (%)","Progression (%)"
|
||||||
|
"Name","Nom"
|
||||||
|
"Subject","Objet"
|
||||||
|
"Thank you for providing your feedback.","Merci pour votre retour."
|
||||||
|
"Click here","Cliquez ici"
|
||||||
|
"to view your feedback.","pour afficher votre retour."
|
||||||
|
"Help us improve by providing your feedback.","Aidez‑nous à nous améliorer en nous donnant votre avis."
|
||||||
|
"Submit Feedback","Envoyer le retour"
|
||||||
|
"Average Feedback Received","Retour moyen reçu"
|
||||||
|
"View all feedback","Voir tous les retours"
|
||||||
|
"No feedback received yet.","Aucun retour reçu pour le moment."
|
||||||
|
"Choose an existing question","Choisir une question existante"
|
||||||
|
"Options","Options"
|
||||||
|
"Possibilities","Possibilités"
|
||||||
|
"Option","Option"
|
||||||
|
"Explanation","Explication"
|
||||||
|
"Correct Answer","Réponse correcte"
|
||||||
|
"Select a question","Sélectionner une question"
|
||||||
|
"Test Quiz","Quiz de test"
|
||||||
|
"Questions","Questions"
|
||||||
|
"New Question","Nouvelle question"
|
||||||
|
"No questions added yet","Aucune question ajoutée pour l’instant"
|
||||||
|
"Answer","Réponse"
|
||||||
|
"My availability","Ma disponibilité"
|
||||||
|
"Day","Jour"
|
||||||
|
"Start Time","Heure de début"
|
||||||
|
"End Time","Heure de fin"
|
||||||
|
"Add Slot","Ajouter un créneau"
|
||||||
|
"I am unavailable","Je ne suis pas disponible"
|
||||||
|
"My calendar","Mon calendrier"
|
||||||
|
"Your calendar is set.","Votre calendrier est configuré."
|
||||||
|
"Authorize Google Calendar Access","Autoriser l'accès à Google Agenda"
|
||||||
|
"{0} Exercises","{0} exercices"
|
||||||
|
"Unpublished","Non publié"
|
||||||
|
"No {0}","Aucun {0}"
|
||||||
|
"There are no {0} currently. Keep an eye out, fresh learning experiences are on the way!","Il n’y a actuellement aucun {0}. Restez à l’affût, de nouvelles expériences d’apprentissage arrivent bientôt !"
|
||||||
|
"courses","cours"
|
||||||
|
"Courses","Cours"
|
||||||
|
"completed","terminé"
|
||||||
|
"% completed","% terminé"
|
||||||
|
"Skip","Ignorer"
|
||||||
|
"Create your first course","Créez votre premier cours"
|
||||||
|
"Add your first chapter","Ajoutez votre premier chapitre"
|
||||||
|
"Add your first lesson","Ajoutez votre première leçon"
|
||||||
|
"Create your first quiz","Créez votre premier quiz"
|
||||||
|
"Invite your team and students","Invitez votre équipe et vos étudiants"
|
||||||
|
"Create your first batch","Créez votre première session"
|
||||||
|
"Add students to your batch","Ajoutez des étudiants à votre session"
|
||||||
|
"Add courses to your batch","Ajoutez des cours à votre session"
|
||||||
|
"More","Plus"
|
||||||
|
"Certified Members","Membres certifiés"
|
||||||
|
"Statistics","Statistiques"
|
||||||
|
"Jobs","Emplois"
|
||||||
|
"Batches","Sessions"
|
||||||
|
"Programs","Programmes"
|
||||||
|
"Programming Exercises","Exercices de programmation"
|
||||||
|
"Quizzes","Quiz"
|
||||||
|
"Assignments","Affectations"
|
||||||
|
"Learning","Apprentissage"
|
||||||
|
"Introduction","Introduction"
|
||||||
|
"Setting up","Configuration"
|
||||||
|
"Creating a course","Créer un cours"
|
||||||
|
"Create a course","Créer un cours"
|
||||||
|
"Add a chapter","Ajouter un chapitre"
|
||||||
|
"Add a lesson","Ajouter une leçon"
|
||||||
|
"Creating a batch","Créer une session"
|
||||||
|
"Create a batch","Créer une session"
|
||||||
|
"Create a live class","Créer une classe en direct"
|
||||||
|
"Assessments","Évaluations"
|
||||||
|
"Certification","Certification"
|
||||||
|
"Issue a Certificate","Délivrer un certificat"
|
||||||
|
"Custom Certificate Templates","Modèles de certificats personnalisés"
|
||||||
|
"Monetization","Monétisation"
|
||||||
|
"Setting up payment gateway","Configuration de la passerelle de paiement"
|
||||||
|
"Settings","Paramètres"
|
||||||
|
"Roles","Rôles"
|
||||||
|
"My Profile","Mon profil"
|
||||||
|
"Toggle Theme","Changer de thème"
|
||||||
|
"Apps","Applications"
|
||||||
|
"Log out","Se déconnecter"
|
||||||
|
"Signups","Inscriptions"
|
||||||
|
"Signups per month","Inscriptions par mois"
|
||||||
|
"Enrollments","Inscriptions"
|
||||||
|
"Enrollments per month","Inscriptions par mois"
|
||||||
|
"Certifications","Certifications"
|
||||||
|
"Certifications per month","Certifications par mois"
|
||||||
|
"Completions","Cours terminés"
|
||||||
|
"Total Signups","Inscriptions totales"
|
||||||
|
"Enrollment Count","Nombre d’inscriptions"
|
||||||
|
"Courses Completed","Cours terminés"
|
||||||
|
"Lessons Completed","Leçons terminées"
|
||||||
|
@@ -25,11 +25,12 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/frappe/lms#readme",
|
"homepage": "https://github.com/frappe/lms#readme",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cypress": "^13.9.0",
|
"cypress": "^14.5.2",
|
||||||
"cypress-file-upload": "^5.0.8",
|
"cypress-file-upload": "^5.0.8",
|
||||||
"cypress-real-events": "^1.14.0"
|
"cypress-real-events": "^1.14.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"pre-commit": "^1.2.2"
|
"pre-commit": "^1.2.2"
|
||||||
}
|
},
|
||||||
|
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ dependencies = [
|
|||||||
"markdown~=3.5.1",
|
"markdown~=3.5.1",
|
||||||
"beautifulsoup4~=4.12.2",
|
"beautifulsoup4~=4.12.2",
|
||||||
"lxml~=4.9.3",
|
"lxml~=4.9.3",
|
||||||
"cairocffi~=1.6.1",
|
"cairocffi==1.5.1",
|
||||||
"razorpay~=1.4.1",
|
"razorpay~=1.4.1",
|
||||||
"fuzzywuzzy~=0.18.0",
|
"fuzzywuzzy~=0.18.0",
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user