@fui-org/fui-cli 2.1.4 → 2.2.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 +27 -7
- package/dist/fui-qrb1j9jz.js +397 -0
- package/dist/fui.js +1 -1
- package/package.json +1 -1
- package/skills/fui/SKILL.md +143 -38
- package/skills/fui/agents/fui-builder.md +62 -0
- package/skills/fui/agents/fui-tester.md +77 -0
- package/skills/{fui-skill → fui}/assets/projectdefaultstyle.css +489 -489
- package/skills/{fui-skill → fui}/examples/component.vue +162 -162
- package/skills/{fui-skill → fui}/references/INDEX.md +5 -4
- package/skills/{fui-skill → fui}/references/advanced-techniques.md +170 -168
- package/skills/{fui-skill → fui}/references/component-design.md +2 -2
- package/skills/{fui-skill → fui}/references/component-quickref.md +78 -78
- package/skills/{fui-skill → fui}/references/component-table.md +287 -287
- package/skills/{fui-skill → fui}/references/components-dialog.md +191 -191
- package/skills/{fui-skill → fui}/references/components-display.md +141 -141
- package/skills/{fui-skill → fui}/references/components-echart.md +316 -316
- package/skills/{fui-skill → fui}/references/components-input.md +335 -335
- package/skills/{fui-skill → fui}/references/controls-patterns.md +2 -2
- package/skills/{fui-skill → fui}/references/controls-styling-vocabulary.md +173 -173
- package/skills/{fui-skill → fui}/references/db-workflow.md +9 -9
- package/skills/{fui-skill → fui}/references/default-function.md +456 -456
- package/skills/{fui-skill → fui}/references/design-modes.md +57 -57
- package/skills/{fui-skill → fui}/references/echart-templates.md +489 -489
- package/skills/{fui-skill → fui}/references/fastproject.md +99 -99
- package/skills/{fui-skill → fui}/references/fullstack-workflow.md +314 -313
- package/skills/{fui-skill → fui}/references/module-data-patterns.md +117 -117
- package/skills/{fui-skill → fui}/references/module-json-anatomy.md +132 -132
- package/skills/{fui-skill → fui}/references/module-structure.md +144 -144
- package/skills/{fui-skill → fui}/references/new-session.md +1 -2
- package/skills/{fui-skill → fui}/references/pdfmake.md +60 -60
- package/skills/{fui-skill → fui}/references/permission-system.md +1 -1
- package/skills/{fui-skill → fui}/references/platform-architecture.md +269 -269
- package/skills/{fui-skill → fui}/references/project-config.md +303 -303
- package/skills/{fui-skill → fui}/references/project-provisioning.md +4 -4
- package/skills/{fui-skill → fui}/references/script-map.md +262 -262
- package/skills/{fui-skill → fui}/references/sql-clr-functions.md +225 -225
- package/skills/{fui-skill → fui}/references/system-design.md +2 -2
- package/skills/{fui-skill → fui}/references/tapi-permission-patterns.md +156 -156
- package/skills/{fui-skill → fui}/references/tapi-reference.md +474 -474
- package/skills/fui/references/team-run.md +141 -0
- package/skills/fui/references/tools-registry.md +211 -0
- package/skills/{fui-skill → fui}/references/ui-crosswindow-patterns.md +321 -321
- package/skills/{fui-skill → fui}/references/ui-dialog-patterns.md +255 -255
- package/skills/{fui-skill → fui}/references/ui-layout-patterns.md +176 -176
- package/skills/{fui-skill → fui}/references/ui-patterns.md +303 -303
- package/skills/{fui-skill → fui}/references/ui-screenshot-review.md +95 -95
- package/skills/{fui-skill → fui}/references/ui-table-cell-patterns.md +318 -318
- package/skills/{fui-skill → fui}/references/verification.md +11 -11
- package/skills/{fui-skill → fui}/references/watcher-patterns.md +163 -163
- package/skills/{fui-skill → fui}/references/websocket-realtime.md +271 -271
- package/skills/{fui-skill → fui}/scripts/component-3.0.js +2715 -2715
- package/skills/{fui-skill → fui}/scripts/component.js +3147 -3147
- package/skills/{fui-skill → fui}/scripts/componentTable-3.0.js +1038 -1038
- package/skills/{fui-skill → fui}/scripts/componentTable.js +891 -891
- package/skills/{fui-skill → fui}/scripts/defaultfunction-3.0.js +866 -866
- package/skills/{fui-skill → fui}/scripts/defaultfunction.js +1051 -1051
- package/skills/{fui-skill → fui}/scripts/fastproject-3.0.js +870 -870
- package/skills/{fui-skill → fui}/scripts/fastproject.js +828 -828
- package/dist/fui-h4z7zhk2.js +0 -381
- package/skills/fui-skill/SKILL.md +0 -139
- package/skills/fui-skill/references/tools-registry.md +0 -84
- /package/skills/{fui-skill → fui}/assets/projectdefaultstyle-3.0.css +0 -0
- /package/skills/{fui-skill → fui}/design-md/airbnb/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/airbnb/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/airtable/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/airtable/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/apple/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/apple/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/asu/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/asu/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/binance/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/binance/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/bmw/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/bmw/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/bmw-m/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/bmw-m/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/bugatti/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/bugatti/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/cal/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/cal/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/claude/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/claude/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/clay/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/clay/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/clickhouse/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/clickhouse/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/cohere/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/cohere/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/coinbase/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/coinbase/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/composio/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/composio/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/cursor/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/cursor/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/elevenlabs/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/elevenlabs/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/expo/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/expo/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/ferrari/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/ferrari/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/figma/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/figma/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/framer/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/framer/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/fui/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/hashicorp/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/hashicorp/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/ibm/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/ibm/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/intercom/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/intercom/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/kraken/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/kraken/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/lamborghini/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/lamborghini/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/linear.app/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/linear.app/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/lovable/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/lovable/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/mastercard/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/mastercard/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/meta/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/meta/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/minimax/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/minimax/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/mintlify/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/mintlify/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/miro/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/miro/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/mistral.ai/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/mistral.ai/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/mongodb/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/mongodb/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/nike/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/nike/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/notion/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/notion/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/nvidia/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/nvidia/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/ollama/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/ollama/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/opencode.ai/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/opencode.ai/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/pinterest/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/pinterest/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/playstation/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/playstation/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/posthog/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/posthog/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/raycast/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/raycast/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/renault/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/renault/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/replicate/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/replicate/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/resend/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/resend/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/revolut/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/revolut/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/runwayml/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/runwayml/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/sanity/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/sanity/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/sentry/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/sentry/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/shopify/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/shopify/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/slack/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/spacex/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/spacex/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/spotify/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/spotify/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/starbucks/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/starbucks/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/stripe/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/stripe/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/supabase/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/supabase/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/superhuman/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/superhuman/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/tesla/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/tesla/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/theverge/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/theverge/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/together.ai/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/together.ai/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/uber/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/uber/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/vercel/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/vercel/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/vodafone/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/vodafone/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/voltagent/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/voltagent/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/warp/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/warp/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/webflow/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/webflow/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/wired/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/wired/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/wise/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/wise/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/x.ai/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/x.ai/README.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/zapier/DESIGN.md +0 -0
- /package/skills/{fui-skill → fui}/design-md/zapier/README.md +0 -0
- /package/skills/{fui-skill → fui}/examples/f-table-patterns.json +0 -0
- /package/skills/{fui-skill → fui}/examples/module-patterns.json +0 -0
- /package/skills/{fui-skill → fui}/examples/project-patterns.json +0 -0
- /package/skills/{fui-skill → fui}/references/coding-standards.md +0 -0
- /package/skills/{fui-skill → fui}/references/db-table-design.md +0 -0
- /package/skills/{fui-skill → fui}/references/fsheet.md +0 -0
- /package/skills/{fui-skill → fui}/references/tapi-file-api.md +0 -0
- /package/skills/{fui-skill → fui}/references/ui-templates.md +0 -0
- /package/skills/{fui-skill → fui}/scripts/fechart.js +0 -0
- /package/skills/{fui-skill → fui}/scripts/fsheet.js +0 -0
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="uc-component-name">
|
|
3
|
-
<v-card outlined>
|
|
4
|
-
<v-card-title v-if="title" class="subtitle-1 font-weight-bold">
|
|
5
|
-
<slot name="title">
|
|
6
|
-
{{ title }}
|
|
7
|
-
</slot>
|
|
8
|
-
</v-card-title>
|
|
9
|
-
|
|
10
|
-
<v-card-text>
|
|
11
|
-
<div v-if="loading">
|
|
12
|
-
<slot name="loading">
|
|
13
|
-
Loading...
|
|
14
|
-
</slot>
|
|
15
|
-
</div>
|
|
16
|
-
<div v-else-if="!hasItems">
|
|
17
|
-
<slot name="empty">
|
|
18
|
-
No data
|
|
19
|
-
</slot>
|
|
20
|
-
</div>
|
|
21
|
-
<div v-else>
|
|
22
|
-
<slot :items="localItems" :selected-item="localValue">
|
|
23
|
-
<v-list dense>
|
|
24
|
-
<v-list-item
|
|
25
|
-
v-for="(item, index) in localItems"
|
|
26
|
-
:key="item.id || item.value || index"
|
|
27
|
-
@click="handleSelect(item)"
|
|
28
|
-
>
|
|
29
|
-
<v-list-item-content>
|
|
30
|
-
<v-list-item-title>{{ getItemLabel(item) }}</v-list-item-title>
|
|
31
|
-
</v-list-item-content>
|
|
32
|
-
</v-list-item>
|
|
33
|
-
</v-list>
|
|
34
|
-
</slot>
|
|
35
|
-
|
|
36
|
-
<v-btn
|
|
37
|
-
v-if="showAction"
|
|
38
|
-
small
|
|
39
|
-
color="primary"
|
|
40
|
-
:disabled="disabled"
|
|
41
|
-
@click="handleAction"
|
|
42
|
-
>
|
|
43
|
-
{{ actionLabel }}
|
|
44
|
-
</v-btn>
|
|
45
|
-
</div>
|
|
46
|
-
</v-card-text>
|
|
47
|
-
</v-card>
|
|
48
|
-
</div>
|
|
49
|
-
</template>
|
|
50
|
-
|
|
51
|
-
<script>
|
|
52
|
-
/**
|
|
53
|
-
* Description: Reusable starter component. Prefer generic props, emits, and slots.
|
|
54
|
-
* Usage: <uc-component-name :items="rows" :value="selectedRow" @select="handleSelect"></uc-component-name>
|
|
55
|
-
* NOTE: No "name:" property — FUI resolves name from filename automatically.
|
|
56
|
-
*/
|
|
57
|
-
export default {
|
|
58
|
-
props: {
|
|
59
|
-
title: {
|
|
60
|
-
type: String,
|
|
61
|
-
default: ''
|
|
62
|
-
},
|
|
63
|
-
value: {
|
|
64
|
-
type: [String, Number, Object, Array],
|
|
65
|
-
default: null
|
|
66
|
-
},
|
|
67
|
-
items: {
|
|
68
|
-
type: Array,
|
|
69
|
-
default: function() {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
},
|
|
73
|
-
itemText: {
|
|
74
|
-
type: String,
|
|
75
|
-
default: 'label'
|
|
76
|
-
},
|
|
77
|
-
loading: {
|
|
78
|
-
type: Boolean,
|
|
79
|
-
default: false
|
|
80
|
-
},
|
|
81
|
-
disabled: {
|
|
82
|
-
type: Boolean,
|
|
83
|
-
default: false
|
|
84
|
-
},
|
|
85
|
-
showAction: {
|
|
86
|
-
type: Boolean,
|
|
87
|
-
default: true
|
|
88
|
-
},
|
|
89
|
-
actionLabel: {
|
|
90
|
-
type: String,
|
|
91
|
-
default: 'Action'
|
|
92
|
-
},
|
|
93
|
-
options: {
|
|
94
|
-
type: Object,
|
|
95
|
-
default: function() {
|
|
96
|
-
return {};
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
},
|
|
100
|
-
data() {
|
|
101
|
-
return {
|
|
102
|
-
localValue: null,
|
|
103
|
-
localItems: []
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
computed: {
|
|
107
|
-
hasItems() {
|
|
108
|
-
return this.localItems.length > 0;
|
|
109
|
-
},
|
|
110
|
-
resolvedItemText() {
|
|
111
|
-
return this.options.itemText || this.itemText;
|
|
112
|
-
},
|
|
113
|
-
resolvedItemValue() {
|
|
114
|
-
return this.options.itemValue || 'value';
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
watch: {
|
|
118
|
-
value: {
|
|
119
|
-
handler(val) {
|
|
120
|
-
this.localValue = val;
|
|
121
|
-
},
|
|
122
|
-
immediate: true
|
|
123
|
-
},
|
|
124
|
-
items: {
|
|
125
|
-
handler(val) {
|
|
126
|
-
this.localItems = Array.isArray(val) ? val : [];
|
|
127
|
-
},
|
|
128
|
-
immediate: true
|
|
129
|
-
}
|
|
130
|
-
},
|
|
131
|
-
methods: {
|
|
132
|
-
getItemLabel(item) {
|
|
133
|
-
if (!item || typeof item !== 'object') {
|
|
134
|
-
return item;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return item[this.resolvedItemText] || item.label || item.name || '';
|
|
138
|
-
},
|
|
139
|
-
getItemValue(item) {
|
|
140
|
-
if (!item || typeof item !== 'object') {
|
|
141
|
-
return item;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return item[this.resolvedItemValue] || item.value || item.id || item;
|
|
145
|
-
},
|
|
146
|
-
handleSelect(item) {
|
|
147
|
-
var nextValue = this.getItemValue(item);
|
|
148
|
-
this.localValue = nextValue;
|
|
149
|
-
this.$emit('input', nextValue);
|
|
150
|
-
this.$emit('select', item);
|
|
151
|
-
this.$emit('change', nextValue);
|
|
152
|
-
},
|
|
153
|
-
handleAction() {
|
|
154
|
-
this.$emit('action', {
|
|
155
|
-
value: this.localValue,
|
|
156
|
-
items: this.localItems
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
</script>
|
|
162
|
-
|
|
1
|
+
<template>
|
|
2
|
+
<div class="uc-component-name">
|
|
3
|
+
<v-card outlined>
|
|
4
|
+
<v-card-title v-if="title" class="subtitle-1 font-weight-bold">
|
|
5
|
+
<slot name="title">
|
|
6
|
+
{{ title }}
|
|
7
|
+
</slot>
|
|
8
|
+
</v-card-title>
|
|
9
|
+
|
|
10
|
+
<v-card-text>
|
|
11
|
+
<div v-if="loading">
|
|
12
|
+
<slot name="loading">
|
|
13
|
+
Loading...
|
|
14
|
+
</slot>
|
|
15
|
+
</div>
|
|
16
|
+
<div v-else-if="!hasItems">
|
|
17
|
+
<slot name="empty">
|
|
18
|
+
No data
|
|
19
|
+
</slot>
|
|
20
|
+
</div>
|
|
21
|
+
<div v-else>
|
|
22
|
+
<slot :items="localItems" :selected-item="localValue">
|
|
23
|
+
<v-list dense>
|
|
24
|
+
<v-list-item
|
|
25
|
+
v-for="(item, index) in localItems"
|
|
26
|
+
:key="item.id || item.value || index"
|
|
27
|
+
@click="handleSelect(item)"
|
|
28
|
+
>
|
|
29
|
+
<v-list-item-content>
|
|
30
|
+
<v-list-item-title>{{ getItemLabel(item) }}</v-list-item-title>
|
|
31
|
+
</v-list-item-content>
|
|
32
|
+
</v-list-item>
|
|
33
|
+
</v-list>
|
|
34
|
+
</slot>
|
|
35
|
+
|
|
36
|
+
<v-btn
|
|
37
|
+
v-if="showAction"
|
|
38
|
+
small
|
|
39
|
+
color="primary"
|
|
40
|
+
:disabled="disabled"
|
|
41
|
+
@click="handleAction"
|
|
42
|
+
>
|
|
43
|
+
{{ actionLabel }}
|
|
44
|
+
</v-btn>
|
|
45
|
+
</div>
|
|
46
|
+
</v-card-text>
|
|
47
|
+
</v-card>
|
|
48
|
+
</div>
|
|
49
|
+
</template>
|
|
50
|
+
|
|
51
|
+
<script>
|
|
52
|
+
/**
|
|
53
|
+
* Description: Reusable starter component. Prefer generic props, emits, and slots.
|
|
54
|
+
* Usage: <uc-component-name :items="rows" :value="selectedRow" @select="handleSelect"></uc-component-name>
|
|
55
|
+
* NOTE: No "name:" property — FUI resolves name from filename automatically.
|
|
56
|
+
*/
|
|
57
|
+
export default {
|
|
58
|
+
props: {
|
|
59
|
+
title: {
|
|
60
|
+
type: String,
|
|
61
|
+
default: ''
|
|
62
|
+
},
|
|
63
|
+
value: {
|
|
64
|
+
type: [String, Number, Object, Array],
|
|
65
|
+
default: null
|
|
66
|
+
},
|
|
67
|
+
items: {
|
|
68
|
+
type: Array,
|
|
69
|
+
default: function() {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
itemText: {
|
|
74
|
+
type: String,
|
|
75
|
+
default: 'label'
|
|
76
|
+
},
|
|
77
|
+
loading: {
|
|
78
|
+
type: Boolean,
|
|
79
|
+
default: false
|
|
80
|
+
},
|
|
81
|
+
disabled: {
|
|
82
|
+
type: Boolean,
|
|
83
|
+
default: false
|
|
84
|
+
},
|
|
85
|
+
showAction: {
|
|
86
|
+
type: Boolean,
|
|
87
|
+
default: true
|
|
88
|
+
},
|
|
89
|
+
actionLabel: {
|
|
90
|
+
type: String,
|
|
91
|
+
default: 'Action'
|
|
92
|
+
},
|
|
93
|
+
options: {
|
|
94
|
+
type: Object,
|
|
95
|
+
default: function() {
|
|
96
|
+
return {};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
data() {
|
|
101
|
+
return {
|
|
102
|
+
localValue: null,
|
|
103
|
+
localItems: []
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
computed: {
|
|
107
|
+
hasItems() {
|
|
108
|
+
return this.localItems.length > 0;
|
|
109
|
+
},
|
|
110
|
+
resolvedItemText() {
|
|
111
|
+
return this.options.itemText || this.itemText;
|
|
112
|
+
},
|
|
113
|
+
resolvedItemValue() {
|
|
114
|
+
return this.options.itemValue || 'value';
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
watch: {
|
|
118
|
+
value: {
|
|
119
|
+
handler(val) {
|
|
120
|
+
this.localValue = val;
|
|
121
|
+
},
|
|
122
|
+
immediate: true
|
|
123
|
+
},
|
|
124
|
+
items: {
|
|
125
|
+
handler(val) {
|
|
126
|
+
this.localItems = Array.isArray(val) ? val : [];
|
|
127
|
+
},
|
|
128
|
+
immediate: true
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
methods: {
|
|
132
|
+
getItemLabel(item) {
|
|
133
|
+
if (!item || typeof item !== 'object') {
|
|
134
|
+
return item;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return item[this.resolvedItemText] || item.label || item.name || '';
|
|
138
|
+
},
|
|
139
|
+
getItemValue(item) {
|
|
140
|
+
if (!item || typeof item !== 'object') {
|
|
141
|
+
return item;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return item[this.resolvedItemValue] || item.value || item.id || item;
|
|
145
|
+
},
|
|
146
|
+
handleSelect(item) {
|
|
147
|
+
var nextValue = this.getItemValue(item);
|
|
148
|
+
this.localValue = nextValue;
|
|
149
|
+
this.$emit('input', nextValue);
|
|
150
|
+
this.$emit('select', item);
|
|
151
|
+
this.$emit('change', nextValue);
|
|
152
|
+
},
|
|
153
|
+
handleAction() {
|
|
154
|
+
this.$emit('action', {
|
|
155
|
+
value: this.localValue,
|
|
156
|
+
items: this.localItems
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
</script>
|
|
162
|
+
|
|
@@ -14,7 +14,7 @@ Load: `fui skill ref references/a.md references/b.md` (several at once OK).
|
|
|
14
14
|
|
|
15
15
|
- FUI anatomy, Project→Module hierarchy (import/component/set merge), runtime, vueData/v_Set → `platform-architecture.md`
|
|
16
16
|
- module.json's 4 parts (data/watch/controls/set) → `module-json-anatomy.md`
|
|
17
|
-
- `HTMLOnly: true`: server embeds NO library (Vue/Vuetify/jQuery/lodash/MDI/`projectdefaultstyle.css` absent); declare all in the module; `script-map.md` does NOT apply → `module-structure.md` §HTMLOnly=true:
|
|
17
|
+
- `HTMLOnly: true`: server embeds NO library (Vue/Vuetify/jQuery/lodash/MDI/`projectdefaultstyle.css` absent); declare all in the module; `script-map.md` does NOT apply → `module-structure.md` §"HTMLOnly=true: no library is embedded"
|
|
18
18
|
|
|
19
19
|
## UI / components
|
|
20
20
|
|
|
@@ -57,7 +57,7 @@ Load: `fui skill ref references/a.md references/b.md` (several at once OK).
|
|
|
57
57
|
## User permissions
|
|
58
58
|
|
|
59
59
|
- `SystemRight` (level) vs `FunctionRight` (per function), `v-if`/menu `right`, `fui right system|function list/new/update/delete` (8 commands) → `permission-system.md`
|
|
60
|
-
- Guarding control/menu/SP with a right code — it must exist; how to create → `permission-system.md` (§"
|
|
60
|
+
- Guarding control/menu/SP with a right code — it must exist; how to create → `permission-system.md` (§"A right code must EXIST before guarding with it")
|
|
61
61
|
- SQL permission checks in SP body → `tapi-permission-patterns.md`
|
|
62
62
|
|
|
63
63
|
## Database
|
|
@@ -83,7 +83,7 @@ Load: `fui skill ref references/a.md references/b.md` (several at once OK).
|
|
|
83
83
|
- Ordered commands (reset → reload → toast) in `CALLBACK`/`:action`/`watch`/`THEN` → `controls-patterns.md` §CORE RULE
|
|
84
84
|
- v_old, deep-watch, cascading → `watcher-patterns.md`
|
|
85
85
|
- EXE, MAP, complex expressions → `advanced-techniques.md`
|
|
86
|
-
- Blank page with
|
|
86
|
+
- Blank page (often with no JS error to trace), or complex logic in `:attr` `:option` `:config` → `advanced-techniques.md` §1 + `fui module validate`
|
|
87
87
|
- `… is not defined` at render, or `EXE`/`FUN` doing nothing → `advanced-techniques.md` §2 (function must exist in `script.js`; `fui module publish script`). ⚠️ `fui module validate` misses this; use `fui module simulate --render`
|
|
88
88
|
- Built-in utilities (openWindow, ajaxCALL, jsonToExcel, groupBy…) → `default-function.md`
|
|
89
89
|
- Bundled libs (jQuery, lodash, moment, numeral, toast, jquery-confirm) — check before adding a CDN; ⚠️ `HTMLOnly=false` only → `script-map.md` §0
|
|
@@ -96,9 +96,10 @@ Load: `fui skill ref references/a.md references/b.md` (several at once OK).
|
|
|
96
96
|
|
|
97
97
|
- "new session" / "phiên mới" / "cửa sổ mới": open another Claude Code CLI in its own terminal window (workspace root resolved dynamically, NEVER hard-coded) → `new-session.md`
|
|
98
98
|
- Hand work / instructions to another running Claude session (coordinating several sessions, a multi-AI workflow, parallelizing work per module) — `ListAgents`/`SendMessage` → `new-session.md` §6
|
|
99
|
+
- Build, test and fix one module with little supervision (planner → builder → tester → fix, one approval at the end) → `team-run.md` (the `fui` skill decides between this and a direct change; the agents come with fui)
|
|
99
100
|
- Per-command safety (R/M, Safe/Confirm/Destructive), strict mode, `fui sp verify`, error log → `tools-registry.md`
|
|
100
101
|
- Pre-publish definition-of-done (`fui module validate` + `fui module outline` + `fui module simulate` + static `fui sp verify`) → `verification.md`
|
|
101
|
-
- UI broken, cause unknown — cheapest verification layer (symptom → layer; read BEFORE `--render`, reread after ≥2 renders without progress) → `verification.md` §
|
|
102
|
+
- UI broken, cause unknown — cheapest verification layer (symptom → layer; read BEFORE `--render`, reread after ≥2 renders without progress) → `verification.md` §"Pick the tier by SYMPTOM"
|
|
102
103
|
|
|
103
104
|
## Design system
|
|
104
105
|
|