@winchsa/ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +166 -0
- package/dist/components/Breadcrumbs.vue +46 -0
- package/dist/components/Breadcrumbs.vue.d.ts +6 -0
- package/dist/components/Drawer.vue +60 -0
- package/dist/components/Drawer.vue.d.ts +44 -0
- package/dist/components/IconBtn.vue +18 -0
- package/dist/components/IconBtn.vue.d.ts +30 -0
- package/dist/components/Modal.vue +155 -0
- package/dist/components/Modal.vue.d.ts +0 -0
- package/dist/components/SiteTitle.vue +14 -0
- package/dist/components/SiteTitle.vue.d.ts +2 -0
- package/dist/components/Toaster.vue +19 -0
- package/dist/components/Toaster.vue.d.ts +5 -0
- package/dist/components/cards/CheckboxesCard.vue +76 -0
- package/dist/components/cards/CheckboxesCard.vue.d.ts +20 -0
- package/dist/components/cards/HeaderCard.vue +31 -0
- package/dist/components/cards/HeaderCard.vue.d.ts +8 -0
- package/dist/components/cards/ImageCard.vue +73 -0
- package/dist/components/cards/ImageCard.vue.d.ts +63 -0
- package/dist/components/cards/InputCard.vue +60 -0
- package/dist/components/cards/InputCard.vue.d.ts +41 -0
- package/dist/components/cards/StaticCard.vue +37 -0
- package/dist/components/cards/StaticCard.vue.d.ts +33 -0
- package/dist/components/core/AppBarSearch.vue +345 -0
- package/dist/components/core/AppBarSearch.vue.d.ts +1587 -0
- package/dist/components/core/AppDrawerHeaderSection.vue +21 -0
- package/dist/components/core/AppDrawerHeaderSection.vue.d.ts +30 -0
- package/dist/components/core/AppSearchHeader.vue +72 -0
- package/dist/components/core/AppSearchHeader.vue.d.ts +7 -0
- package/dist/components/core/AppStepper.vue +232 -0
- package/dist/components/core/AppStepper.vue.d.ts +25 -0
- package/dist/components/core/CustomizerSection.vue +19 -0
- package/dist/components/core/CustomizerSection.vue.d.ts +25 -0
- package/dist/components/core/DialogCloseBtn.vue +20 -0
- package/dist/components/core/DialogCloseBtn.vue.d.ts +9 -0
- package/dist/components/core/MoreBtn.vue +27 -0
- package/dist/components/core/MoreBtn.vue.d.ts +25 -0
- package/dist/components/core/ScrollToTop.vue +39 -0
- package/dist/components/core/ScrollToTop.vue.d.ts +2 -0
- package/dist/components/core/app-form-elements/AppCombobox.vue +67 -0
- package/dist/components/core/app-form-elements/AppCombobox.vue.d.ts +0 -0
- package/dist/components/core/app-form-elements/AppSelect.vue +98 -0
- package/dist/components/core/app-form-elements/AppSelect.vue.d.ts +0 -0
- package/dist/components/core/app-form-elements/AppSwitch.vue +59 -0
- package/dist/components/core/app-form-elements/AppSwitch.vue.d.ts +27 -0
- package/dist/components/core/app-form-elements/AppTextField.vue +66 -0
- package/dist/components/core/app-form-elements/AppTextField.vue.d.ts +26 -0
- package/dist/components/core/app-form-elements/AppTextarea.vue +69 -0
- package/dist/components/core/app-form-elements/AppTextarea.vue.d.ts +26 -0
- package/dist/components/core/app-form-elements/CustomCheckboxes.vue +69 -0
- package/dist/components/core/app-form-elements/CustomCheckboxes.vue.d.ts +39 -0
- package/dist/components/core/app-form-elements/CustomCheckboxesWithIcon.vue +80 -0
- package/dist/components/core/app-form-elements/CustomCheckboxesWithIcon.vue.d.ts +39 -0
- package/dist/components/core/app-form-elements/CustomCheckboxesWithImage.vue +67 -0
- package/dist/components/core/app-form-elements/CustomCheckboxesWithImage.vue.d.ts +15 -0
- package/dist/components/core/app-form-elements/CustomRadios.vue +69 -0
- package/dist/components/core/app-form-elements/CustomRadios.vue.d.ts +40 -0
- package/dist/components/core/app-form-elements/CustomRadiosWithIcon.vue +98 -0
- package/dist/components/core/app-form-elements/CustomRadiosWithIcon.vue.d.ts +45 -0
- package/dist/components/core/app-form-elements/CustomRadiosWithImage.vue +69 -0
- package/dist/components/core/app-form-elements/CustomRadiosWithImage.vue.d.ts +53 -0
- package/dist/components/core/cards/AppCard.vue +45 -0
- package/dist/components/core/cards/AppCard.vue.d.ts +26 -0
- package/dist/components/core/cards/AppCardActions.vue +126 -0
- package/dist/components/core/cards/AppCardActions.vue.d.ts +79 -0
- package/dist/components/core/cards/CardStatisticsHorizontal.vue +29 -0
- package/dist/components/core/cards/CardStatisticsHorizontal.vue.d.ts +10 -0
- package/dist/components/forms/Accordion.vue +43 -0
- package/dist/components/forms/Accordion.vue.d.ts +35 -0
- package/dist/components/forms/AppLabel.vue +47 -0
- package/dist/components/forms/AppLabel.vue.d.ts +36 -0
- package/dist/components/forms/AppLink.vue +50 -0
- package/dist/components/forms/AppLink.vue.d.ts +27 -0
- package/dist/components/forms/AppNumberField.vue +85 -0
- package/dist/components/forms/AppNumberField.vue.d.ts +45 -0
- package/dist/components/forms/AppOtpInput.vue +84 -0
- package/dist/components/forms/AppOtpInput.vue.d.ts +16 -0
- package/dist/components/forms/AttachmentCropperInput.vue +228 -0
- package/dist/components/forms/AttachmentCropperInput.vue.d.ts +25 -0
- package/dist/components/forms/AttachmentInput.vue +116 -0
- package/dist/components/forms/AttachmentInput.vue.d.ts +20 -0
- package/dist/components/forms/AutocompleteInput.vue +759 -0
- package/dist/components/forms/AutocompleteInput.vue.d.ts +0 -0
- package/dist/components/forms/BankSelect.vue +43 -0
- package/dist/components/forms/BankSelect.vue.d.ts +19 -0
- package/dist/components/forms/BaseButton.vue +42 -0
- package/dist/components/forms/BaseButton.vue.d.ts +31 -0
- package/dist/components/forms/CounterInput.vue +71 -0
- package/dist/components/forms/CounterInput.vue.d.ts +15 -0
- package/dist/components/forms/DatePicker.vue +400 -0
- package/dist/components/forms/DatePicker.vue.d.ts +34 -0
- package/dist/components/forms/DatePickerRange.vue +129 -0
- package/dist/components/forms/DatePickerRange.vue.d.ts +23 -0
- package/dist/components/forms/DraggedUploadFile.vue +120 -0
- package/dist/components/forms/DraggedUploadFile.vue.d.ts +10 -0
- package/dist/components/forms/ImageCardInput.vue +234 -0
- package/dist/components/forms/ImageCardInput.vue.d.ts +0 -0
- package/dist/components/forms/InputValidationWrapper.vue +24 -0
- package/dist/components/forms/InputValidationWrapper.vue.d.ts +33 -0
- package/dist/components/forms/LicensePlateInput.vue +159 -0
- package/dist/components/forms/LicensePlateInput.vue.d.ts +16 -0
- package/dist/components/forms/ManualDate.vue +262 -0
- package/dist/components/forms/ManualDate.vue.d.ts +17 -0
- package/dist/components/forms/MobileInput.vue +118 -0
- package/dist/components/forms/MobileInput.vue.d.ts +49 -0
- package/dist/components/forms/PasswordInput.vue +29 -0
- package/dist/components/forms/PasswordInput.vue.d.ts +13 -0
- package/dist/components/forms/RangeInput.vue +48 -0
- package/dist/components/forms/RangeInput.vue.d.ts +5 -0
- package/dist/components/forms/Tabs.vue +35 -0
- package/dist/components/forms/Tabs.vue.d.ts +42 -0
- package/dist/components/forms/TimePicker.vue +370 -0
- package/dist/components/forms/TimePicker.vue.d.ts +23 -0
- package/dist/components/icons/EndMarker.vue +25 -0
- package/dist/components/icons/EndMarker.vue.d.ts +17 -0
- package/dist/components/icons/RedXIcon.vue +36 -0
- package/dist/components/icons/RedXIcon.vue.d.ts +2 -0
- package/dist/components/icons/StarFillIcon.vue +28 -0
- package/dist/components/icons/StarFillIcon.vue.d.ts +2 -0
- package/dist/components/icons/StartMarker.vue +25 -0
- package/dist/components/icons/StartMarker.vue.d.ts +17 -0
- package/dist/components/icons/WorkerIcon.vue +39 -0
- package/dist/components/icons/WorkerIcon.vue.d.ts +2 -0
- package/dist/components/loading/LoadingBar.vue +31 -0
- package/dist/components/loading/LoadingBar.vue.d.ts +5 -0
- package/dist/components/loading/LoadingDialog.vue +41 -0
- package/dist/components/loading/LoadingDialog.vue.d.ts +11 -0
- package/dist/components/loading/LoadingItem.vue +66 -0
- package/dist/components/loading/LoadingItem.vue.d.ts +47 -0
- package/dist/components/table/DataTable.vue +319 -0
- package/dist/components/table/DataTable.vue.d.ts +0 -0
- package/dist/components/table/EditableDataTable.vue +329 -0
- package/dist/components/table/EditableDataTable.vue.d.ts +73 -0
- package/dist/components/table/EditableDataTableRow.vue +243 -0
- package/dist/components/table/EditableDataTableRow.vue.d.ts +18 -0
- package/dist/components/table/FilterGenerator.vue +232 -0
- package/dist/components/table/FilterGenerator.vue.d.ts +14 -0
- package/dist/components/table/StaticTable.vue +152 -0
- package/dist/components/table/StaticTable.vue.d.ts +25 -0
- package/dist/components/table/TablePagination.vue +73 -0
- package/dist/components/table/TablePagination.vue.d.ts +13 -0
- package/dist/composables/use-is-mobile.d.ts +1 -0
- package/dist/composables/use-is-mobile.js +10 -0
- package/dist/composables/use-is-mobile.mjs +4 -0
- package/dist/composables/use-table-filters.d.ts +23 -0
- package/dist/composables/use-table-filters.js +196 -0
- package/dist/composables/use-table-filters.mjs +183 -0
- package/dist/fonts/NotoSans-Medium.ttf +0 -0
- package/dist/fonts/NotoSansArabic-Medium.ttf +0 -0
- package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.eot +0 -0
- package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.svg +9 -0
- package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.ttf +0 -0
- package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.woff +0 -0
- package/dist/fonts/saudi_riyal_symbol/saudi_riyal_symbol.woff2 +0 -0
- package/dist/images/avatar.png +0 -0
- package/dist/images/sa.svg +1 -0
- package/dist/images/successful-registration.svg +15 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +447 -0
- package/dist/index.mjs +128 -0
- package/dist/styles/@core/scss/base/_components.scss +164 -0
- package/dist/styles/@core/scss/base/_dark.scss +16 -0
- package/dist/styles/@core/scss/base/_default-layout-w-vertical-nav.scss +106 -0
- package/dist/styles/@core/scss/base/_default-layout.scss +16 -0
- package/dist/styles/@core/scss/base/_index.scss +47 -0
- package/dist/styles/@core/scss/base/_layouts.scss +63 -0
- package/dist/styles/@core/scss/base/_misc.scss +20 -0
- package/dist/styles/@core/scss/base/_mixins.scss +84 -0
- package/dist/styles/@core/scss/base/_route-transitions.scss +70 -0
- package/dist/styles/@core/scss/base/_utilities.scss +418 -0
- package/dist/styles/@core/scss/base/_utils.scss +100 -0
- package/dist/styles/@core/scss/base/_variables.scss +190 -0
- package/dist/styles/@core/scss/base/_vertical-nav.scss +264 -0
- package/dist/styles/@core/scss/base/libs/_perfect-scrollbar.scss +35 -0
- package/dist/styles/@core/scss/base/libs/vuetify/_index.scss +1 -0
- package/dist/styles/@core/scss/base/libs/vuetify/_overrides.scss +385 -0
- package/dist/styles/@core/scss/base/libs/vuetify/_variables.scss +48 -0
- package/dist/styles/@core/scss/base/placeholders/_default-layout-vertical-nav.scss +48 -0
- package/dist/styles/@core/scss/base/placeholders/_default-layout.scss +3 -0
- package/dist/styles/@core/scss/base/placeholders/_index.scss +5 -0
- package/dist/styles/@core/scss/base/placeholders/_misc.scss +7 -0
- package/dist/styles/@core/scss/base/placeholders/_nav.scss +26 -0
- package/dist/styles/@core/scss/base/placeholders/_vertical-nav.scss +84 -0
- package/dist/styles/@core/scss/base/skins/_bordered.scss +60 -0
- package/dist/styles/@core/scss/base/skins/_index.scss +1 -0
- package/dist/styles/@core/scss/template/_components.scss +1035 -0
- package/dist/styles/@core/scss/template/_default-layout-w-vertical-nav.scss +20 -0
- package/dist/styles/@core/scss/template/_utilities.scss +20 -0
- package/dist/styles/@core/scss/template/_variables.scss +67 -0
- package/dist/styles/@core/scss/template/_vertical-nav.scss +41 -0
- package/dist/styles/@core/scss/template/index.css +18764 -0
- package/dist/styles/@core/scss/template/index.scss +15 -0
- package/dist/styles/@core/scss/template/libs/apex-chart.css +90 -0
- package/dist/styles/@core/scss/template/libs/apex-chart.scss +99 -0
- package/dist/styles/@core/scss/template/libs/shepherd.css +82 -0
- package/dist/styles/@core/scss/template/libs/shepherd.scss +88 -0
- package/dist/styles/@core/scss/template/libs/vuetify/_variables.scss +461 -0
- package/dist/styles/@core/scss/template/libs/vuetify/index.css +741 -0
- package/dist/styles/@core/scss/template/libs/vuetify/index.scss +1 -0
- package/dist/styles/@core/scss/template/pages/misc.css +16 -0
- package/dist/styles/@core/scss/template/pages/misc.scss +20 -0
- package/dist/styles/@core/scss/template/placeholders/_default-layout-vertical-nav.scss +9 -0
- package/dist/styles/@core/scss/template/placeholders/_index.scss +3 -0
- package/dist/styles/@core/scss/template/placeholders/_nav.scss +15 -0
- package/dist/styles/@core/scss/template/placeholders/_vertical-nav.scss +18 -0
- package/dist/styles/@core/scss/template/skins/_bordered.scss +36 -0
- package/dist/styles/@core/scss/template/skins/_index.scss +1 -0
- package/dist/styles/@layouts/styles/_classes.scss +3 -0
- package/dist/styles/@layouts/styles/_dashboard-layout.scss +43 -0
- package/dist/styles/@layouts/styles/_global.scss +10 -0
- package/dist/styles/@layouts/styles/_mixins.scss +28 -0
- package/dist/styles/@layouts/styles/_placeholders.scss +53 -0
- package/dist/styles/@layouts/styles/_rtl.scss +7 -0
- package/dist/styles/@layouts/styles/_variables.scss +22 -0
- package/dist/styles/@layouts/styles/index.css +14 -0
- package/dist/styles/@layouts/styles/index.scss +2 -0
- package/dist/styles/assets/scss/styles.css +16099 -0
- package/dist/styles/assets/scss/styles.scss +246 -0
- package/dist/styles/assets/scss/variables/_template.scss +1 -0
- package/dist/styles/assets/scss/variables/_vuetify.scss +1 -0
- package/dist/types.d.ts +226 -0
- package/dist/utils/apiUrl.d.ts +1 -0
- package/dist/utils/apiUrl.js +15 -0
- package/dist/utils/apiUrl.mjs +8 -0
- package/dist/utils/client.d.ts +9 -0
- package/dist/utils/client.js +39 -0
- package/dist/utils/client.mjs +25 -0
- package/dist/utils/files.d.ts +2 -0
- package/dist/utils/files.js +35 -0
- package/dist/utils/files.mjs +22 -0
- package/dist/utils/formValidation.d.ts +7 -0
- package/dist/utils/formValidation.js +20 -0
- package/dist/utils/formValidation.mjs +13 -0
- package/dist/utils/formatters.d.ts +12 -0
- package/dist/utils/formatters.js +84 -0
- package/dist/utils/formatters.mjs +56 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.js +104 -0
- package/dist/utils/index.mjs +9 -0
- package/dist/utils/queryParams.d.ts +4 -0
- package/dist/utils/queryParams.js +26 -0
- package/dist/utils/queryParams.mjs +18 -0
- package/dist/utils/ruleValidator.d.ts +28 -0
- package/dist/utils/ruleValidator.js +158 -0
- package/dist/utils/ruleValidator.mjs +144 -0
- package/dist/utils/toaster.d.ts +12 -0
- package/dist/utils/toaster.js +71 -0
- package/dist/utils/toaster.mjs +59 -0
- package/dist/utils/utils.d.ts +8 -0
- package/dist/utils/utils.js +70 -0
- package/dist/utils/utils.mjs +56 -0
- package/package.json +79 -0
- package/src/styles/@core/scss/base/_components.scss +164 -0
- package/src/styles/@core/scss/base/_dark.scss +16 -0
- package/src/styles/@core/scss/base/_default-layout-w-vertical-nav.scss +106 -0
- package/src/styles/@core/scss/base/_default-layout.scss +16 -0
- package/src/styles/@core/scss/base/_index.scss +47 -0
- package/src/styles/@core/scss/base/_layouts.scss +63 -0
- package/src/styles/@core/scss/base/_misc.scss +20 -0
- package/src/styles/@core/scss/base/_mixins.scss +84 -0
- package/src/styles/@core/scss/base/_route-transitions.scss +70 -0
- package/src/styles/@core/scss/base/_utilities.scss +418 -0
- package/src/styles/@core/scss/base/_utils.scss +100 -0
- package/src/styles/@core/scss/base/_variables.scss +190 -0
- package/src/styles/@core/scss/base/_vertical-nav.scss +264 -0
- package/src/styles/@core/scss/base/libs/_perfect-scrollbar.scss +35 -0
- package/src/styles/@core/scss/base/libs/vuetify/_index.scss +1 -0
- package/src/styles/@core/scss/base/libs/vuetify/_overrides.scss +385 -0
- package/src/styles/@core/scss/base/libs/vuetify/_variables.scss +48 -0
- package/src/styles/@core/scss/base/placeholders/_default-layout-vertical-nav.scss +48 -0
- package/src/styles/@core/scss/base/placeholders/_default-layout.scss +3 -0
- package/src/styles/@core/scss/base/placeholders/_index.scss +5 -0
- package/src/styles/@core/scss/base/placeholders/_misc.scss +7 -0
- package/src/styles/@core/scss/base/placeholders/_nav.scss +26 -0
- package/src/styles/@core/scss/base/placeholders/_vertical-nav.scss +84 -0
- package/src/styles/@core/scss/base/skins/_bordered.scss +60 -0
- package/src/styles/@core/scss/base/skins/_index.scss +1 -0
- package/src/styles/@core/scss/template/_components.scss +1035 -0
- package/src/styles/@core/scss/template/_default-layout-w-vertical-nav.scss +20 -0
- package/src/styles/@core/scss/template/_utilities.scss +20 -0
- package/src/styles/@core/scss/template/_variables.scss +67 -0
- package/src/styles/@core/scss/template/_vertical-nav.scss +41 -0
- package/src/styles/@core/scss/template/index.scss +15 -0
- package/src/styles/@core/scss/template/libs/apex-chart.scss +99 -0
- package/src/styles/@core/scss/template/libs/shepherd.scss +88 -0
- package/src/styles/@core/scss/template/libs/vuetify/_variables.scss +461 -0
- package/src/styles/@core/scss/template/libs/vuetify/index.scss +1 -0
- package/src/styles/@core/scss/template/pages/misc.scss +20 -0
- package/src/styles/@core/scss/template/placeholders/_default-layout-vertical-nav.scss +9 -0
- package/src/styles/@core/scss/template/placeholders/_index.scss +3 -0
- package/src/styles/@core/scss/template/placeholders/_nav.scss +15 -0
- package/src/styles/@core/scss/template/placeholders/_vertical-nav.scss +18 -0
- package/src/styles/@core/scss/template/skins/_bordered.scss +36 -0
- package/src/styles/@core/scss/template/skins/_index.scss +1 -0
- package/src/styles/@layouts/styles/_classes.scss +3 -0
- package/src/styles/@layouts/styles/_dashboard-layout.scss +43 -0
- package/src/styles/@layouts/styles/_global.scss +10 -0
- package/src/styles/@layouts/styles/_mixins.scss +28 -0
- package/src/styles/@layouts/styles/_placeholders.scss +53 -0
- package/src/styles/@layouts/styles/_rtl.scss +7 -0
- package/src/styles/@layouts/styles/_variables.scss +22 -0
- package/src/styles/@layouts/styles/index.scss +2 -0
- package/src/styles/assets/scss/styles.scss +246 -0
- package/src/styles/assets/scss/variables/_template.scss +1 -0
- package/src/styles/assets/scss/variables/_vuetify.scss +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Winch UI
|
|
2
|
+
|
|
3
|
+
A Vue 3 + Vuetify UI component library for Winch SA.
|
|
4
|
+
|
|
5
|
+
**🚧 TESTING VERSION** - This is a test version published to personal npm account.
|
|
6
|
+
|
|
7
|
+
## 📦 Publishing Workflow
|
|
8
|
+
|
|
9
|
+
### Prerequisites
|
|
10
|
+
|
|
11
|
+
1. **NPM Token**: Add `NPM_TOKEN` secret to your GitHub repository settings
|
|
12
|
+
- Go to [npmjs.com](https://www.npmjs.com) → Account Settings → Access Tokens
|
|
13
|
+
- Create a new token with "Automation" type
|
|
14
|
+
- Add it as `NPM_TOKEN` in your repository secrets
|
|
15
|
+
|
|
16
|
+
2. **Personal Account**: This test version uses your personal npm account
|
|
17
|
+
|
|
18
|
+
### Publishing Options
|
|
19
|
+
|
|
20
|
+
#### Option 1: Automatic Publishing (Recommended)
|
|
21
|
+
The package automatically publishes when you push to the main branch:
|
|
22
|
+
|
|
23
|
+
- **Every commit** to main triggers an automatic patch version bump and release
|
|
24
|
+
- **Manual workflow** can be triggered from GitHub Actions tab for specific version bumps
|
|
25
|
+
- **Git tags** starting with `v` trigger immediate releases
|
|
26
|
+
|
|
27
|
+
#### Option 2: Manual Version Bumps
|
|
28
|
+
```bash
|
|
29
|
+
# For patch releases (0.1.0 → 0.1.1)
|
|
30
|
+
pnpm run publish:patch
|
|
31
|
+
|
|
32
|
+
# For minor releases (0.1.0 → 0.2.0)
|
|
33
|
+
pnpm run publish:minor
|
|
34
|
+
|
|
35
|
+
# For major releases (0.1.0 → 1.0.0)
|
|
36
|
+
pnpm run publish:major
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
#### Option 3: GitHub Actions Manual Trigger
|
|
40
|
+
1. Go to your repository's "Actions" tab
|
|
41
|
+
2. Select "Release" workflow
|
|
42
|
+
3. Click "Run workflow"
|
|
43
|
+
4. Choose version type (patch/minor/major)
|
|
44
|
+
5. Click "Run workflow"
|
|
45
|
+
|
|
46
|
+
#### Option 4: Git Tags
|
|
47
|
+
Create a git tag to trigger immediate release:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git tag v0.1.1
|
|
51
|
+
git push origin v0.1.1
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### Option 5: Direct Publishing
|
|
55
|
+
```bash
|
|
56
|
+
# Build and publish directly
|
|
57
|
+
pnpm run release
|
|
58
|
+
|
|
59
|
+
# Dry run to test publishing without publishing
|
|
60
|
+
pnpm run release:dry-run
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 🚀 Installation in Projects (TESTING)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Using pnpm
|
|
67
|
+
pnpm add @winchsa/ui
|
|
68
|
+
|
|
69
|
+
# Using npm
|
|
70
|
+
npm install @winchsa/ui
|
|
71
|
+
|
|
72
|
+
# Using yarn
|
|
73
|
+
yarn add @winchsa/ui
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 📖 Usage
|
|
77
|
+
|
|
78
|
+
```vue
|
|
79
|
+
<template>
|
|
80
|
+
<div>
|
|
81
|
+
<!-- Your Winch UI components here -->
|
|
82
|
+
</div>
|
|
83
|
+
</template>
|
|
84
|
+
|
|
85
|
+
<script setup>
|
|
86
|
+
// Import components as needed
|
|
87
|
+
// import { YourComponent } from '@winchsa/ui'
|
|
88
|
+
</script>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 🛠️ Development
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Install dependencies
|
|
95
|
+
pnpm install
|
|
96
|
+
|
|
97
|
+
# Start development server
|
|
98
|
+
pnpm run dev
|
|
99
|
+
|
|
100
|
+
# Build for production
|
|
101
|
+
pnpm run build
|
|
102
|
+
|
|
103
|
+
# Run linting
|
|
104
|
+
pnpm run lint
|
|
105
|
+
|
|
106
|
+
# Fix linting issues
|
|
107
|
+
pnpm run lint:fix
|
|
108
|
+
|
|
109
|
+
# Run tests
|
|
110
|
+
pnpm run test
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 🔄 GitHub Actions Workflows
|
|
114
|
+
|
|
115
|
+
### CI Workflow (`ci.yml`)
|
|
116
|
+
- Runs on every push and pull request
|
|
117
|
+
- Lints code, runs tests, and builds the package
|
|
118
|
+
- Ensures code quality before merging
|
|
119
|
+
|
|
120
|
+
### Auto Version Bump (`auto-version.yml`)
|
|
121
|
+
- Automatically bumps patch version on commits to main
|
|
122
|
+
- Skips version bumps for documentation changes
|
|
123
|
+
- Prevents infinite loops on version bump commits
|
|
124
|
+
|
|
125
|
+
### Release Workflow (`release.yml`)
|
|
126
|
+
- Publishes to npm when version changes
|
|
127
|
+
- Creates GitHub releases for tagged versions
|
|
128
|
+
- Handles both automatic and manual version bumps
|
|
129
|
+
- Checks for duplicate versions before publishing
|
|
130
|
+
|
|
131
|
+
## 📋 Release Notes
|
|
132
|
+
|
|
133
|
+
The workflow will automatically:
|
|
134
|
+
- ✅ Run CI checks (lint, test, build)
|
|
135
|
+
- ✅ Bump version automatically on commits
|
|
136
|
+
- ✅ Build the library
|
|
137
|
+
- ✅ Check if version already exists on npm
|
|
138
|
+
- ✅ Publish to npm with public access (personal account)
|
|
139
|
+
- ✅ Create GitHub releases for tagged versions
|
|
140
|
+
- ✅ Skip publishing if version already exists
|
|
141
|
+
- ✅ Handle manual version bumps via GitHub Actions
|
|
142
|
+
|
|
143
|
+
## 🔓 Public Package (Testing)
|
|
144
|
+
|
|
145
|
+
This test version is published with public access to your personal npm account.
|
|
146
|
+
|
|
147
|
+
## 🚨 Troubleshooting
|
|
148
|
+
|
|
149
|
+
### Version Already Exists
|
|
150
|
+
If you get an error that a version already exists:
|
|
151
|
+
1. Check the current version in `package.json`
|
|
152
|
+
2. Use a different version type (patch/minor/major)
|
|
153
|
+
3. Or manually edit the version in `package.json`
|
|
154
|
+
|
|
155
|
+
### Publishing Fails
|
|
156
|
+
1. Ensure `NPM_TOKEN` is set in repository secrets
|
|
157
|
+
2. Check that you have publish permissions to `@winchsa/ui`
|
|
158
|
+
3. Verify the package builds successfully locally
|
|
159
|
+
|
|
160
|
+
## 🔄 Moving to Organization
|
|
161
|
+
|
|
162
|
+
When ready to move to the organization:
|
|
163
|
+
1. Change package name back to `@winchsa/ui`
|
|
164
|
+
2. Update access to `restricted` in both `package.json` and `.npmrc`
|
|
165
|
+
3. Update GitHub Actions workflows
|
|
166
|
+
4. Ensure organization has paid npm plan for private packages
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from "vue";
|
|
3
|
+
import { useI18n } from "vue-i18n";
|
|
4
|
+
import { useRoute } from "vue-router";
|
|
5
|
+
import { VBreadcrumbsItem, VBreadcrumbs } from "vuetify/components";
|
|
6
|
+
import AppLink from "./forms/AppLink.vue";
|
|
7
|
+
const { t } = useI18n();
|
|
8
|
+
const { path } = useRoute();
|
|
9
|
+
const props = defineProps({
|
|
10
|
+
items: { type: Array, required: true }
|
|
11
|
+
});
|
|
12
|
+
const itemsBreadcrumb = computed(() => props.items.map((item) => {
|
|
13
|
+
if (props.items.lastIndexOf(item) === props.items.length - 1) {
|
|
14
|
+
item.to = path;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
...item,
|
|
18
|
+
title: item.hasLang === false ? item.title : t(item.title, item?.params || {})
|
|
19
|
+
};
|
|
20
|
+
}));
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<template>
|
|
24
|
+
<VBreadcrumbs color="blue">
|
|
25
|
+
<VBreadcrumbsItem v-for="(item, index) in itemsBreadcrumb" :key="item.title" @click="item.onClick">
|
|
26
|
+
<p v-if="itemsBreadcrumb.length - 1 === index" class="ma-0 text-gray-600">
|
|
27
|
+
{{ item.title }}
|
|
28
|
+
</p>
|
|
29
|
+
<AppLink v-else :to="item.to">
|
|
30
|
+
{{ item.title }}
|
|
31
|
+
</AppLink>
|
|
32
|
+
<span v-if="itemsBreadcrumb.length - 1 !== index" class="v-breadcrumbs-divider text-gray-600">/</span>
|
|
33
|
+
</VBreadcrumbsItem>
|
|
34
|
+
</VBreadcrumbs>
|
|
35
|
+
</template>
|
|
36
|
+
|
|
37
|
+
<style scoped>
|
|
38
|
+
:deep(.v-breadcrumbs-item--active.v-breadcrumbs-item--disabled) a {
|
|
39
|
+
pointer-events: all;
|
|
40
|
+
user-select: text !important;
|
|
41
|
+
cursor: text !important;
|
|
42
|
+
}
|
|
43
|
+
:deep(.v-breadcrumbs-item--active.v-breadcrumbs-item--disabled) a::after {
|
|
44
|
+
display: none !important;
|
|
45
|
+
}
|
|
46
|
+
</style>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Breadcrumb } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
items: Breadcrumb[];
|
|
4
|
+
};
|
|
5
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { VCardTitle, VDialog, VCardActions, VCardText } from "vuetify/components";
|
|
3
|
+
import AppCard from "./core/cards/AppCard.vue";
|
|
4
|
+
import IconBtn from "./IconBtn.vue";
|
|
5
|
+
defineProps({
|
|
6
|
+
isAppRtl: { type: Boolean, required: true }
|
|
7
|
+
});
|
|
8
|
+
const editModal = defineModel("editModal", { type: Boolean });
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<VDialog
|
|
13
|
+
v-model="editModal"
|
|
14
|
+
max-width="480"
|
|
15
|
+
height="100%"
|
|
16
|
+
class="my-0 edit_driver_modal"
|
|
17
|
+
:content-class="isAppRtl ? 'left' : 'right'"
|
|
18
|
+
:transition="isAppRtl ? 'slide-x-transition' : 'slide-x-reverse-transition'"
|
|
19
|
+
>
|
|
20
|
+
<AppCard class="h-100 py-10">
|
|
21
|
+
<VCardTitle class="d-flex justify-space-between">
|
|
22
|
+
<slot name="title" />
|
|
23
|
+
|
|
24
|
+
<IconBtn
|
|
25
|
+
size="small"
|
|
26
|
+
icon="tabler-x"
|
|
27
|
+
@click="editModal = false"
|
|
28
|
+
/>
|
|
29
|
+
</VCardTitle>
|
|
30
|
+
|
|
31
|
+
<VCardText class="d-flex flex-column h-100">
|
|
32
|
+
<div class="flex-grow-1">
|
|
33
|
+
<slot />
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<VCardActions class="pa-0">
|
|
37
|
+
<slot name="actions" />
|
|
38
|
+
</VCardActions>
|
|
39
|
+
</VCardText>
|
|
40
|
+
</AppCard>
|
|
41
|
+
</VDialog>
|
|
42
|
+
</template>
|
|
43
|
+
|
|
44
|
+
<style scoped>
|
|
45
|
+
:deep(.v-overlay__content) {
|
|
46
|
+
margin: 0px;
|
|
47
|
+
max-height: 100%;
|
|
48
|
+
height: 100%;
|
|
49
|
+
}
|
|
50
|
+
:deep(.v-overlay__content).left {
|
|
51
|
+
left: 0;
|
|
52
|
+
}
|
|
53
|
+
:deep(.v-overlay__content).right {
|
|
54
|
+
right: 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
:deep(.v-tabs) {
|
|
58
|
+
border: none !important;
|
|
59
|
+
}
|
|
60
|
+
</style>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { VCardTitle, VDialog, VCardActions, VCardText } from 'vuetify/components';
|
|
2
|
+
import AppCard from './core/cards/AppCard.vue';
|
|
3
|
+
import IconBtn from './IconBtn.vue';
|
|
4
|
+
type __VLS_Props = {
|
|
5
|
+
isAppRtl: boolean;
|
|
6
|
+
};
|
|
7
|
+
declare const editModal: import("vue").ModelRef<boolean | undefined, string, boolean | undefined, boolean | undefined>;
|
|
8
|
+
type __VLS_PublicProps = {
|
|
9
|
+
'editModal'?: boolean;
|
|
10
|
+
} & __VLS_Props;
|
|
11
|
+
declare const __VLS_ctx: InstanceType<__VLS_PickNotAny<typeof __VLS_self, new () => {}>>;
|
|
12
|
+
declare var __VLS_13: {}, __VLS_26: {}, __VLS_32: {};
|
|
13
|
+
type __VLS_Slots = __VLS_PrettifyGlobal<__VLS_OmitStringIndex<typeof __VLS_ctx.$slots> & {
|
|
14
|
+
title?: (props: typeof __VLS_13) => any;
|
|
15
|
+
} & {
|
|
16
|
+
default?: (props: typeof __VLS_26) => any;
|
|
17
|
+
} & {
|
|
18
|
+
actions?: (props: typeof __VLS_32) => any;
|
|
19
|
+
}>;
|
|
20
|
+
declare const __VLS_self: import("vue").DefineComponent<__VLS_PublicProps, {
|
|
21
|
+
VCardTitle: typeof VCardTitle;
|
|
22
|
+
VDialog: typeof VDialog;
|
|
23
|
+
VCardActions: typeof VCardActions;
|
|
24
|
+
VCardText: typeof VCardText;
|
|
25
|
+
AppCard: typeof AppCard;
|
|
26
|
+
IconBtn: typeof IconBtn;
|
|
27
|
+
editModal: typeof editModal;
|
|
28
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
29
|
+
"update:editModal": (value: boolean | undefined) => any;
|
|
30
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
31
|
+
"onUpdate:editModal"?: ((value: boolean | undefined) => any) | undefined;
|
|
32
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
33
|
+
declare const __VLS_component: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
34
|
+
"update:editModal": (value: boolean | undefined) => any;
|
|
35
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
36
|
+
"onUpdate:editModal"?: ((value: boolean | undefined) => any) | undefined;
|
|
37
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
38
|
+
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
39
|
+
export default _default;
|
|
40
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
41
|
+
new (): {
|
|
42
|
+
$slots: S;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { VBtn } from "vuetify/components";
|
|
3
|
+
const props = defineProps({
|
|
4
|
+
color: { type: null, required: false, default: "default" },
|
|
5
|
+
variant: { type: null, required: false, default: "text" },
|
|
6
|
+
density: { type: null, required: false, default: "comfortable" }
|
|
7
|
+
});
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<VBtn :icon="true" v-bind="{ ...props, ...$attrs }">
|
|
12
|
+
<slot />
|
|
13
|
+
</VBtn>
|
|
14
|
+
</template>
|
|
15
|
+
|
|
16
|
+
<style>
|
|
17
|
+
.v-btn .v-icon{height:22px;width:22px}
|
|
18
|
+
</style>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { VBtn } from 'vuetify/components';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
color?: any;
|
|
4
|
+
variant?: any;
|
|
5
|
+
density?: any;
|
|
6
|
+
};
|
|
7
|
+
declare const __VLS_ctx: InstanceType<__VLS_PickNotAny<typeof __VLS_self, new () => {}>>;
|
|
8
|
+
declare var __VLS_6: {};
|
|
9
|
+
type __VLS_Slots = __VLS_PrettifyGlobal<__VLS_OmitStringIndex<typeof __VLS_ctx.$slots> & {
|
|
10
|
+
default?: (props: typeof __VLS_6) => any;
|
|
11
|
+
}>;
|
|
12
|
+
declare const __VLS_self: import("vue").DefineComponent<__VLS_Props, {
|
|
13
|
+
VBtn: typeof VBtn;
|
|
14
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
15
|
+
color: any;
|
|
16
|
+
density: any;
|
|
17
|
+
variant: any;
|
|
18
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const __VLS_component: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
20
|
+
color: any;
|
|
21
|
+
density: any;
|
|
22
|
+
variant: any;
|
|
23
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
24
|
+
declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
|
|
25
|
+
export default _default;
|
|
26
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
27
|
+
new (): {
|
|
28
|
+
$slots: S;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { PerfectScrollbar } from "vue3-perfect-scrollbar";
|
|
3
|
+
import { useDisplay } from "vuetify";
|
|
4
|
+
import { computed, nextTick, ref } from "vue";
|
|
5
|
+
import { VDialog, VCol, VRow, VIcon } from "vuetify/components";
|
|
6
|
+
import { useI18n } from "vue-i18n";
|
|
7
|
+
import AppCard from "../components/core/cards/AppCard.vue";
|
|
8
|
+
import BaseButton from "./forms/BaseButton.vue";
|
|
9
|
+
import DialogCloseBtn from "./core/DialogCloseBtn.vue";
|
|
10
|
+
const { xs } = useDisplay();
|
|
11
|
+
const { t } = useI18n();
|
|
12
|
+
const props = defineProps({
|
|
13
|
+
modelValue: { type: Boolean, required: false, default: false },
|
|
14
|
+
persistent: { type: Boolean, required: false, default: false },
|
|
15
|
+
title: { type: String, required: false, default: "" },
|
|
16
|
+
width: { type: String, required: false, default: "434px" },
|
|
17
|
+
maxWidth: { type: String, required: false, default: "70%" },
|
|
18
|
+
zIndex: { type: String, required: false, default: "9999" },
|
|
19
|
+
confirmBtn: { type: [Object, null], required: false, default: () => ({
|
|
20
|
+
text: "actions.save",
|
|
21
|
+
color: "primary"
|
|
22
|
+
}) },
|
|
23
|
+
closeBtn: { type: [Object, null], required: false, default: () => ({
|
|
24
|
+
text: "actions.cancel",
|
|
25
|
+
color: "gray-200"
|
|
26
|
+
}) },
|
|
27
|
+
hasIcon: { type: Boolean, required: false, default: true },
|
|
28
|
+
icon: { type: String, required: false, default: "tabler-info-circle" },
|
|
29
|
+
iconColor: { type: String, required: false, default: "primary" },
|
|
30
|
+
contentContainerClass: { type: Array, required: false },
|
|
31
|
+
showActions: { type: Boolean, required: false, default: true },
|
|
32
|
+
loading: { type: Boolean, required: false },
|
|
33
|
+
actionsClass: { type: [String, Array], required: false },
|
|
34
|
+
height: { type: [String, Number], required: false }
|
|
35
|
+
});
|
|
36
|
+
const emits = defineEmits(["update:modelValue", "save", "cancel"]);
|
|
37
|
+
const modalScrollbarRef = ref(null);
|
|
38
|
+
const save = () => {
|
|
39
|
+
emits("save");
|
|
40
|
+
};
|
|
41
|
+
const cancel = () => {
|
|
42
|
+
isOpen.value = false;
|
|
43
|
+
emits("cancel");
|
|
44
|
+
};
|
|
45
|
+
const isOpen = computed({
|
|
46
|
+
get() {
|
|
47
|
+
return props.modelValue;
|
|
48
|
+
},
|
|
49
|
+
set(value) {
|
|
50
|
+
emits("update:modelValue", value);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const checkScrollbar = () => {
|
|
54
|
+
nextTick(() => {
|
|
55
|
+
if (modalScrollbarRef?.value?.ps) {
|
|
56
|
+
modalScrollbarRef?.value?.ps.update();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const mergedConfirmBtn = computed(() => ({
|
|
61
|
+
text: "actions.save",
|
|
62
|
+
color: "primary",
|
|
63
|
+
disabled: false,
|
|
64
|
+
...props.confirmBtn || {}
|
|
65
|
+
}));
|
|
66
|
+
const mergedCloseBtn = computed(() => ({
|
|
67
|
+
text: "actions.cancel",
|
|
68
|
+
color: "gray-200",
|
|
69
|
+
disabled: false,
|
|
70
|
+
...props.closeBtn || {}
|
|
71
|
+
}));
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<template>
|
|
75
|
+
<PerfectScrollbar
|
|
76
|
+
ref="modalScrollbarRef"
|
|
77
|
+
:options="{
|
|
78
|
+
wheelPropagation: false,
|
|
79
|
+
suppressScrollX: true
|
|
80
|
+
}"
|
|
81
|
+
@mouseover="checkScrollbar"
|
|
82
|
+
>
|
|
83
|
+
<VDialog
|
|
84
|
+
v-model="isOpen"
|
|
85
|
+
:width="xs ? '100%' : width"
|
|
86
|
+
:max-width="xs ? '90%' : maxWidth"
|
|
87
|
+
:z-index="zIndex"
|
|
88
|
+
:persistent="persistent"
|
|
89
|
+
:height="height"
|
|
90
|
+
>
|
|
91
|
+
<DialogCloseBtn @click="cancel" />
|
|
92
|
+
<AppCard class="pa-4 pb-0 h-100" :height="height">
|
|
93
|
+
<div v-if="title" class="d-flex justify-space-between border-b pb-2 mb-3">
|
|
94
|
+
<h4 class="mb-2 font-weight-bold">
|
|
95
|
+
{{ title }}
|
|
96
|
+
</h4>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div class="d-flex flex-column align-center justify-center gap-2" :class="contentContainerClass">
|
|
100
|
+
<div v-if="hasIcon" class="d-flex align-center justify-center app-w-50px app-h-50px rounded-pill position-relative my-4">
|
|
101
|
+
<div class="d-flex align-center justify-center app-w-60px app-h-60px rounded-pill position-absolute app-opacity-17" :class="`bg-${iconColor}`" />
|
|
102
|
+
<div class="d-flex align-center justify-center app-w-50px app-h-50px rounded-pill position-absolute app-opacity-11" :class="`bg-${iconColor}`" />
|
|
103
|
+
<VIcon
|
|
104
|
+
size="30"
|
|
105
|
+
:icon="icon"
|
|
106
|
+
:color="iconColor"
|
|
107
|
+
/>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="w-100 text-center">
|
|
110
|
+
<slot />
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
<slot v-if="showActions" name="actions">
|
|
115
|
+
<VRow class="modal-actions" no-gutters>
|
|
116
|
+
<slot name="additional-actions" />
|
|
117
|
+
<VCol
|
|
118
|
+
cols="12"
|
|
119
|
+
:class="actionsClass"
|
|
120
|
+
class="d-flex flex-wrap justify-center gap-4 mt-4 "
|
|
121
|
+
>
|
|
122
|
+
<BaseButton
|
|
123
|
+
v-if="mergedCloseBtn"
|
|
124
|
+
:color="mergedCloseBtn.color"
|
|
125
|
+
:disabled="mergedCloseBtn?.disabled"
|
|
126
|
+
class="flex-1-1"
|
|
127
|
+
elevation="0"
|
|
128
|
+
@click="cancel"
|
|
129
|
+
>
|
|
130
|
+
{{ t(mergedCloseBtn.text) }}
|
|
131
|
+
</BaseButton>
|
|
132
|
+
|
|
133
|
+
<BaseButton
|
|
134
|
+
v-if="mergedConfirmBtn"
|
|
135
|
+
type="submit"
|
|
136
|
+
class="flex-1-1"
|
|
137
|
+
:color="mergedConfirmBtn.color"
|
|
138
|
+
:disabled="mergedConfirmBtn?.disabled"
|
|
139
|
+
elevation="0"
|
|
140
|
+
:loading="loading"
|
|
141
|
+
@click="save"
|
|
142
|
+
>
|
|
143
|
+
{{ t(mergedConfirmBtn.text) }}
|
|
144
|
+
</BaseButton>
|
|
145
|
+
</VCol>
|
|
146
|
+
</VRow>
|
|
147
|
+
</slot>
|
|
148
|
+
</AppCard>
|
|
149
|
+
</VDialog>
|
|
150
|
+
</PerfectScrollbar>
|
|
151
|
+
</template>
|
|
152
|
+
|
|
153
|
+
<style scoped>
|
|
154
|
+
.modal-actions{background-color:#fff;bottom:0;padding-bottom:18px;position:sticky}
|
|
155
|
+
</style>
|
|
File without changes
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed } from "vue";
|
|
3
|
+
import { useI18n } from "vue-i18n";
|
|
4
|
+
const { t } = useI18n();
|
|
5
|
+
const siteName = computed(() => {
|
|
6
|
+
return t(`${import.meta.env.VITE_APP_TYPE}_site_name`);
|
|
7
|
+
});
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<h2 class="text-center">
|
|
12
|
+
{{ siteName }}
|
|
13
|
+
</h2>
|
|
14
|
+
</template>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
export default _default;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { Toaster } from "vue-sonner";
|
|
3
|
+
defineProps({
|
|
4
|
+
theme: { type: String, required: true }
|
|
5
|
+
});
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<Toaster
|
|
10
|
+
position="top-center"
|
|
11
|
+
:theme="theme"
|
|
12
|
+
close-button
|
|
13
|
+
rich-colors
|
|
14
|
+
/>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<style>
|
|
18
|
+
[data-sonner-toast] [data-icon]{margin:0}[data-sonner-toast] [data-icon] svg{margin-inline-start:-2px}[data-sonner-toaster][data-theme=light]{--normal-bg:#fff;--normal-text:var(--gray12);--normal-icon:#fdc930;--success-text:#28c76f;--error-text:#ea5455;--error-bg:#fbe3e4;--error-border:#fbe3e4;--success-bg:#dcf6e8;--success-border:#dcf6e8}[data-sonner-toaster][data-theme=dark]{--normal-bg:#2f3349;--normal-border:#2f3349;--normal-text:var(--gray1);--success-text:#28c76f;--error-text:#ea5455;--error-bg:#4c384b;--error-border:#4c384b;--success-bg:#2d4b4f;--success-border:#2d4b4f}[data-sonner-toast][data-styled=true]{gap:10px!important}
|
|
19
|
+
</style>
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
theme: 'light' | 'dark';
|
|
3
|
+
};
|
|
4
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { onMounted, reactive, watch } from "vue";
|
|
3
|
+
import { VCardItem, VCheckbox, VDivider } from "vuetify/components";
|
|
4
|
+
import AppCard from "../core/cards/AppCard.vue";
|
|
5
|
+
const props = defineProps({
|
|
6
|
+
id: { type: [String, Number], required: false, default: "" },
|
|
7
|
+
title: { type: String, required: false, default: "" },
|
|
8
|
+
modelValue: { type: Array, required: true, default: () => [] }
|
|
9
|
+
});
|
|
10
|
+
const data = reactive({
|
|
11
|
+
selectedAll: false,
|
|
12
|
+
model: props.modelValue || []
|
|
13
|
+
});
|
|
14
|
+
const emit = defineEmits(["update:modelValue"]);
|
|
15
|
+
watch(
|
|
16
|
+
() => props.modelValue,
|
|
17
|
+
() => {
|
|
18
|
+
data.model = props.modelValue;
|
|
19
|
+
}
|
|
20
|
+
);
|
|
21
|
+
watch(
|
|
22
|
+
() => data.model,
|
|
23
|
+
() => {
|
|
24
|
+
allCheckboxSelected();
|
|
25
|
+
getItemOnChange();
|
|
26
|
+
},
|
|
27
|
+
{ deep: true }
|
|
28
|
+
);
|
|
29
|
+
onMounted(() => {
|
|
30
|
+
allCheckboxSelected();
|
|
31
|
+
});
|
|
32
|
+
const selectAll = () => {
|
|
33
|
+
data.selectedAll = !data.selectedAll;
|
|
34
|
+
data.model.forEach((item) => item.selected = data.selectedAll);
|
|
35
|
+
};
|
|
36
|
+
function allCheckboxSelected() {
|
|
37
|
+
data.model.find((item) => item.selected === false || item.selected === void 0) ? data.selectedAll = false : data.selectedAll = true;
|
|
38
|
+
}
|
|
39
|
+
function getItemOnChange() {
|
|
40
|
+
emit("update:modelValue", data.model);
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
<template>
|
|
45
|
+
<AppCard class="h-100">
|
|
46
|
+
<!-- title card -->
|
|
47
|
+
<VCardItem class="text-center">
|
|
48
|
+
<div class="d-flex justify-space-between w-100">
|
|
49
|
+
<h3 class="fw-bold">
|
|
50
|
+
{{ title }}
|
|
51
|
+
</h3>
|
|
52
|
+
|
|
53
|
+
<VCheckbox
|
|
54
|
+
v-model="data.selectedAll"
|
|
55
|
+
class="form-check-input"
|
|
56
|
+
@click="selectAll()"
|
|
57
|
+
/>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<VDivider />
|
|
61
|
+
</VCardItem>
|
|
62
|
+
|
|
63
|
+
<VCardItem class="pt-0">
|
|
64
|
+
<div
|
|
65
|
+
v-for="(item, key) in data.model"
|
|
66
|
+
:key="key"
|
|
67
|
+
class="d-flex justify-space-between mb-2"
|
|
68
|
+
>
|
|
69
|
+
<span>{{ item.label }}</span>
|
|
70
|
+
|
|
71
|
+
<!-- item checkbox -->
|
|
72
|
+
<VCheckbox v-model="item.selected" />
|
|
73
|
+
</div>
|
|
74
|
+
</VCardItem>
|
|
75
|
+
</AppCard>
|
|
76
|
+
</template>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type ChechboxModel = {
|
|
2
|
+
key: string | number;
|
|
3
|
+
label: string;
|
|
4
|
+
selected?: boolean;
|
|
5
|
+
};
|
|
6
|
+
type __VLS_Props = {
|
|
7
|
+
id?: string | number;
|
|
8
|
+
title?: string;
|
|
9
|
+
modelValue: ChechboxModel[];
|
|
10
|
+
};
|
|
11
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
12
|
+
"update:modelValue": (value: ChechboxModel[]) => any;
|
|
13
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
14
|
+
"onUpdate:modelValue"?: ((value: ChechboxModel[]) => any) | undefined;
|
|
15
|
+
}>, {
|
|
16
|
+
title: string;
|
|
17
|
+
modelValue: ChechboxModel[];
|
|
18
|
+
id: string | number;
|
|
19
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
20
|
+
export default _default;
|