@fickou/quasar-workflow 1.0.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/LICENSE +21 -0
- package/README.md +535 -0
- package/dist/composables/useWorkflow.d.ts +108 -0
- package/dist/composables/useWorkflow.js +183 -0
- package/dist/composables/useWorkflow.js.map +1 -0
- package/dist/composables/useWorkflowAdmin.d.ts +51 -0
- package/dist/composables/useWorkflowAdmin.js +140 -0
- package/dist/composables/useWorkflowAdmin.js.map +1 -0
- package/dist/composables/useWorkflowDashboard.d.ts +72 -0
- package/dist/composables/useWorkflowDashboard.js +40 -0
- package/dist/composables/useWorkflowDashboard.js.map +1 -0
- package/dist/composables/useWorkflowDelegation.d.ts +76 -0
- package/dist/composables/useWorkflowDelegation.js +87 -0
- package/dist/composables/useWorkflowDelegation.js.map +1 -0
- package/dist/composables/useWorkflowFieldControl.d.ts +19 -0
- package/dist/composables/useWorkflowFieldControl.js +111 -0
- package/dist/composables/useWorkflowFieldControl.js.map +1 -0
- package/dist/composables/useWorkflowStats.d.ts +21 -0
- package/dist/composables/useWorkflowStats.js +87 -0
- package/dist/composables/useWorkflowStats.js.map +1 -0
- package/dist/composables/useWorkflowWebSocket.d.ts +26 -0
- package/dist/composables/useWorkflowWebSocket.js +140 -0
- package/dist/composables/useWorkflowWebSocket.js.map +1 -0
- package/dist/directives/vWorkflowField.d.ts +2 -0
- package/dist/directives/vWorkflowField.js +59 -0
- package/dist/directives/vWorkflowField.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/WorkflowPlugin.d.ts +6 -0
- package/dist/plugins/WorkflowPlugin.js +36 -0
- package/dist/plugins/WorkflowPlugin.js.map +1 -0
- package/dist/types/index.d.ts +47 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWorkflowDelegation.js","sourceRoot":"","sources":["../../composables/useWorkflowDelegation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ComputedRef, Ref } from 'vue';
|
|
2
|
+
import { FormMode, FieldState, WorkflowInstanceDTO, WorkflowDefinitionDTO } from '../types';
|
|
3
|
+
interface UseWorkflowFieldControlOptions {
|
|
4
|
+
instance: Ref<WorkflowInstanceDTO | null>;
|
|
5
|
+
definition: Ref<WorkflowDefinitionDTO | null>;
|
|
6
|
+
currentUserId?: Ref<string | null>;
|
|
7
|
+
creatorId?: Ref<string | null>;
|
|
8
|
+
}
|
|
9
|
+
interface WorkflowFieldControlReturn {
|
|
10
|
+
fieldState: (fieldName: string) => FieldState;
|
|
11
|
+
formMode: ComputedRef<FormMode>;
|
|
12
|
+
canEdit: ComputedRef<boolean>;
|
|
13
|
+
canDelete: ComputedRef<boolean>;
|
|
14
|
+
canSubmit: ComputedRef<boolean>;
|
|
15
|
+
canResubmit: ComputedRef<boolean>;
|
|
16
|
+
isLoading: Ref<boolean>;
|
|
17
|
+
}
|
|
18
|
+
export declare function useWorkflowFieldControl(options: UseWorkflowFieldControlOptions): WorkflowFieldControlReturn;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ref, computed } from 'vue';
|
|
2
|
+
export function useWorkflowFieldControl(options) {
|
|
3
|
+
const { instance, definition, currentUserId, creatorId } = options;
|
|
4
|
+
// isLoading exposé — le composant parent peut l'alimenter
|
|
5
|
+
const isLoading = ref(false);
|
|
6
|
+
// Calcul du formMode selon la matrice de l'instance
|
|
7
|
+
const formMode = computed(() => {
|
|
8
|
+
// Pas d'entityId renseigné → création
|
|
9
|
+
if (!instance.value && !definition.value)
|
|
10
|
+
return 'create';
|
|
11
|
+
// Entité connue mais aucune instance active
|
|
12
|
+
if (!instance.value)
|
|
13
|
+
return 'view';
|
|
14
|
+
switch (instance.value.status) {
|
|
15
|
+
case 'in_progress':
|
|
16
|
+
return 'edit';
|
|
17
|
+
case 'suspended':
|
|
18
|
+
// Document suspendu : comportement identique à in_progress pour les champs
|
|
19
|
+
return 'edit';
|
|
20
|
+
case 'correction_pending': {
|
|
21
|
+
// Seul le créateur du document accède au mode correction
|
|
22
|
+
const isCreator = !currentUserId?.value ||
|
|
23
|
+
!creatorId?.value ||
|
|
24
|
+
currentUserId.value === creatorId.value;
|
|
25
|
+
return isCreator ? 'correction' : 'view';
|
|
26
|
+
}
|
|
27
|
+
case 'completed':
|
|
28
|
+
case 'cancelled':
|
|
29
|
+
case 'rejected':
|
|
30
|
+
return 'locked';
|
|
31
|
+
default:
|
|
32
|
+
return 'view';
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
// canEdit : vrai si le document est modifiable par l'utilisateur courant
|
|
36
|
+
// Matrice : create=true, view=true (avant soumission), edit=false (en workflow),
|
|
37
|
+
// correction=true, locked=false
|
|
38
|
+
const canEdit = computed(() => {
|
|
39
|
+
switch (formMode.value) {
|
|
40
|
+
case 'create':
|
|
41
|
+
return true;
|
|
42
|
+
case 'view':
|
|
43
|
+
return true;
|
|
44
|
+
case 'edit':
|
|
45
|
+
return false;
|
|
46
|
+
case 'correction':
|
|
47
|
+
return true;
|
|
48
|
+
case 'locked':
|
|
49
|
+
return false;
|
|
50
|
+
default:
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// canDelete : false dès que ever_started = true (règle absolue et irréversible)
|
|
55
|
+
// Le backend est la source de vérité finale — ce calcul est uniquement pour l'UX
|
|
56
|
+
const canDelete = computed(() => {
|
|
57
|
+
if (instance.value?.ever_started)
|
|
58
|
+
return false;
|
|
59
|
+
if (formMode.value === 'create')
|
|
60
|
+
return false;
|
|
61
|
+
return formMode.value === 'view';
|
|
62
|
+
});
|
|
63
|
+
// canSubmit : vrai si en mode view ET auto_start = false ET pas d'instance active
|
|
64
|
+
const canSubmit = computed(() => {
|
|
65
|
+
return (formMode.value === 'view' &&
|
|
66
|
+
definition.value?.auto_start === false &&
|
|
67
|
+
!instance.value);
|
|
68
|
+
});
|
|
69
|
+
// canResubmit : vrai si en mode correction (créateur seulement)
|
|
70
|
+
const canResubmit = computed(() => {
|
|
71
|
+
return formMode.value === 'correction';
|
|
72
|
+
});
|
|
73
|
+
// Calcul de l'état d'un champ selon le formMode et les editable_fields de l'étape courante
|
|
74
|
+
const fieldState = (fieldName) => {
|
|
75
|
+
switch (formMode.value) {
|
|
76
|
+
case 'create':
|
|
77
|
+
case 'correction':
|
|
78
|
+
return 'editable';
|
|
79
|
+
case 'locked':
|
|
80
|
+
return 'disabled';
|
|
81
|
+
case 'edit':
|
|
82
|
+
case 'suspended': {
|
|
83
|
+
if (!instance.value)
|
|
84
|
+
return 'readonly';
|
|
85
|
+
// Recherche de l'étape active dans le snapshot
|
|
86
|
+
const activeStep = instance.value.steps?.find((s) => s.status === 'active');
|
|
87
|
+
if (activeStep && instance.value.snapshot) {
|
|
88
|
+
const snapshotData = instance.value.snapshot.snapshot_data;
|
|
89
|
+
const stepDef = snapshotData?.steps?.find((s) => s.id === activeStep.step_id);
|
|
90
|
+
if (stepDef?.editable_fields?.includes(fieldName)) {
|
|
91
|
+
return 'editable';
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return 'readonly';
|
|
95
|
+
}
|
|
96
|
+
case 'view':
|
|
97
|
+
default:
|
|
98
|
+
return 'readonly';
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
return {
|
|
102
|
+
fieldState,
|
|
103
|
+
formMode,
|
|
104
|
+
canEdit,
|
|
105
|
+
canDelete,
|
|
106
|
+
canSubmit,
|
|
107
|
+
canResubmit,
|
|
108
|
+
isLoading,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=useWorkflowFieldControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWorkflowFieldControl.js","sourceRoot":"","sources":["../../composables/useWorkflowFieldControl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface StatsFilters {
|
|
2
|
+
from?: string;
|
|
3
|
+
to?: string;
|
|
4
|
+
entityType?: string;
|
|
5
|
+
workflowDefinitionId?: string;
|
|
6
|
+
period?: 'day' | 'week' | 'month';
|
|
7
|
+
}
|
|
8
|
+
export declare function useWorkflowStats(options?: {
|
|
9
|
+
apiBase?: string;
|
|
10
|
+
}): {
|
|
11
|
+
delays: import("vue").Ref<Record<string, unknown>[], Record<string, unknown>[]>;
|
|
12
|
+
rejectionRates: import("vue").Ref<Record<string, unknown>[], Record<string, unknown>[]>;
|
|
13
|
+
volumes: import("vue").Ref<Record<string, unknown>[], Record<string, unknown>[]>;
|
|
14
|
+
loading: import("vue").Ref<boolean, boolean>;
|
|
15
|
+
error: import("vue").Ref<string | null, string | null>;
|
|
16
|
+
fetchDelays: (filters?: StatsFilters) => Promise<void>;
|
|
17
|
+
fetchRejectionRates: (filters?: StatsFilters) => Promise<void>;
|
|
18
|
+
fetchVolumes: (filters?: StatsFilters) => Promise<void>;
|
|
19
|
+
fetchAll: (filters?: StatsFilters) => Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ref, inject } from 'vue';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
// Composable pour les statistiques workflow (workflow_manager minimum)
|
|
4
|
+
export function useWorkflowStats(options) {
|
|
5
|
+
const injectedApiBase = inject('workflowApiBase', '/api/workflow');
|
|
6
|
+
const apiBase = options?.apiBase ?? injectedApiBase;
|
|
7
|
+
const delays = ref([]);
|
|
8
|
+
const rejectionRates = ref([]);
|
|
9
|
+
const volumes = ref([]);
|
|
10
|
+
const loading = ref(false);
|
|
11
|
+
const error = ref(null);
|
|
12
|
+
const buildParams = (filters) => {
|
|
13
|
+
const params = new URLSearchParams();
|
|
14
|
+
if (filters.from)
|
|
15
|
+
params.set('from', filters.from);
|
|
16
|
+
if (filters.to)
|
|
17
|
+
params.set('to', filters.to);
|
|
18
|
+
if (filters.entityType)
|
|
19
|
+
params.set('entity_type', filters.entityType);
|
|
20
|
+
if (filters.workflowDefinitionId)
|
|
21
|
+
params.set('workflow_definition_id', filters.workflowDefinitionId);
|
|
22
|
+
if (filters.period)
|
|
23
|
+
params.set('period', filters.period);
|
|
24
|
+
return params.toString();
|
|
25
|
+
};
|
|
26
|
+
const fetchDelays = async (filters = {}) => {
|
|
27
|
+
loading.value = true;
|
|
28
|
+
error.value = null;
|
|
29
|
+
try {
|
|
30
|
+
const res = await axios.get(`${apiBase}/stats/delays?${buildParams(filters)}`);
|
|
31
|
+
delays.value = res.data;
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
error.value = String(err);
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
loading.value = false;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const fetchRejectionRates = async (filters = {}) => {
|
|
41
|
+
loading.value = true;
|
|
42
|
+
error.value = null;
|
|
43
|
+
try {
|
|
44
|
+
const res = await axios.get(`${apiBase}/stats/rejection-rates?${buildParams(filters)}`);
|
|
45
|
+
rejectionRates.value = res.data;
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
error.value = String(err);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
loading.value = false;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const fetchVolumes = async (filters = {}) => {
|
|
55
|
+
loading.value = true;
|
|
56
|
+
error.value = null;
|
|
57
|
+
try {
|
|
58
|
+
const res = await axios.get(`${apiBase}/stats/volumes?${buildParams(filters)}`);
|
|
59
|
+
volumes.value = res.data;
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
error.value = String(err);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
loading.value = false;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const fetchAll = async (filters = {}) => {
|
|
69
|
+
await Promise.all([
|
|
70
|
+
fetchDelays(filters),
|
|
71
|
+
fetchRejectionRates(filters),
|
|
72
|
+
fetchVolumes(filters),
|
|
73
|
+
]);
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
delays,
|
|
77
|
+
rejectionRates,
|
|
78
|
+
volumes,
|
|
79
|
+
loading,
|
|
80
|
+
error,
|
|
81
|
+
fetchDelays,
|
|
82
|
+
fetchRejectionRates,
|
|
83
|
+
fetchVolumes,
|
|
84
|
+
fetchAll,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=useWorkflowStats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWorkflowStats.js","sourceRoot":"","sources":["../../composables/useWorkflowStats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Ref } from 'vue';
|
|
2
|
+
export interface WorkflowWsEvent {
|
|
3
|
+
event: string;
|
|
4
|
+
data: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
type Callback<T = Record<string, unknown>> = (data: T) => void;
|
|
7
|
+
export declare function useWorkflowWebSocket(instanceId: Ref<string | null>, options?: {
|
|
8
|
+
wsUrl?: string;
|
|
9
|
+
}): {
|
|
10
|
+
isConnected: Ref<boolean, boolean>;
|
|
11
|
+
lastEvent: Ref<{
|
|
12
|
+
event: string;
|
|
13
|
+
data: Record<string, unknown>;
|
|
14
|
+
} | null, WorkflowWsEvent | {
|
|
15
|
+
event: string;
|
|
16
|
+
data: Record<string, unknown>;
|
|
17
|
+
} | null>;
|
|
18
|
+
onStepChanged: (cb: Callback) => void;
|
|
19
|
+
onActionExecuted: (cb: Callback) => void;
|
|
20
|
+
onStatusChanged: (cb: Callback) => void;
|
|
21
|
+
onConflict: (cb: Callback) => void;
|
|
22
|
+
on: (event: string, cb: Callback) => void;
|
|
23
|
+
off: (event: string, cb: Callback) => void;
|
|
24
|
+
disconnect: () => void;
|
|
25
|
+
};
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ref, watch, onUnmounted } from 'vue';
|
|
2
|
+
// Reconnexion avec backoff exponentiel
|
|
3
|
+
const BACKOFF_BASE_MS = 1000;
|
|
4
|
+
const BACKOFF_MAX_MS = 30000;
|
|
5
|
+
const BACKOFF_MULTIPLIER = 2;
|
|
6
|
+
export function useWorkflowWebSocket(instanceId, options) {
|
|
7
|
+
const isConnected = ref(false);
|
|
8
|
+
const lastEvent = ref(null);
|
|
9
|
+
let socket = null;
|
|
10
|
+
let reconnectTimer = null;
|
|
11
|
+
let currentBackoff = BACKOFF_BASE_MS;
|
|
12
|
+
let isDestroyed = false;
|
|
13
|
+
// Registres de callbacks par type d'événement
|
|
14
|
+
const callbacks = new Map();
|
|
15
|
+
const on = (event, cb) => {
|
|
16
|
+
if (!callbacks.has(event))
|
|
17
|
+
callbacks.set(event, []);
|
|
18
|
+
callbacks.get(event).push(cb);
|
|
19
|
+
};
|
|
20
|
+
const off = (event, cb) => {
|
|
21
|
+
const list = callbacks.get(event);
|
|
22
|
+
if (list)
|
|
23
|
+
callbacks.set(event, list.filter((c) => c !== cb));
|
|
24
|
+
};
|
|
25
|
+
const dispatch = (event, data) => {
|
|
26
|
+
lastEvent.value = { event, data };
|
|
27
|
+
const list = callbacks.get(event) ?? [];
|
|
28
|
+
for (const cb of list) {
|
|
29
|
+
try {
|
|
30
|
+
cb(data);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error(`[WorkflowWebSocket] Erreur dans le callback "${event}":`, err);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const connect = (id) => {
|
|
38
|
+
if (isDestroyed)
|
|
39
|
+
return;
|
|
40
|
+
// Fermeture de la connexion existante avant reconnexion
|
|
41
|
+
if (socket && socket.readyState !== WebSocket.CLOSED) {
|
|
42
|
+
socket.close();
|
|
43
|
+
}
|
|
44
|
+
const wsUrl = options?.wsUrl || 'ws://localhost:3333';
|
|
45
|
+
const url = `${wsUrl}/workflow?instanceId=${id}`;
|
|
46
|
+
try {
|
|
47
|
+
socket = new WebSocket(url);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error('[WorkflowWebSocket] Erreur de connexion:', err);
|
|
51
|
+
scheduleReconnect(id);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
socket.onopen = () => {
|
|
55
|
+
isConnected.value = true;
|
|
56
|
+
currentBackoff = BACKOFF_BASE_MS; // Remise à zéro du backoff à la connexion réussie
|
|
57
|
+
// Demande de rejoindre la room de l'instance
|
|
58
|
+
send({ type: 'join:instance', instanceId: id });
|
|
59
|
+
};
|
|
60
|
+
socket.onmessage = (event) => {
|
|
61
|
+
try {
|
|
62
|
+
const message = JSON.parse(event.data);
|
|
63
|
+
dispatch(message.type, message.data ?? {});
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
console.warn('[WorkflowWebSocket] Message non JSON reçu:', event.data);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
socket.onerror = (event) => {
|
|
70
|
+
console.error('[WorkflowWebSocket] Erreur WebSocket:', event);
|
|
71
|
+
};
|
|
72
|
+
socket.onclose = () => {
|
|
73
|
+
isConnected.value = false;
|
|
74
|
+
if (!isDestroyed && id) {
|
|
75
|
+
scheduleReconnect(id);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
const scheduleReconnect = (id) => {
|
|
80
|
+
if (isDestroyed)
|
|
81
|
+
return;
|
|
82
|
+
if (reconnectTimer)
|
|
83
|
+
clearTimeout(reconnectTimer);
|
|
84
|
+
reconnectTimer = setTimeout(() => {
|
|
85
|
+
if (!isDestroyed) {
|
|
86
|
+
connect(id);
|
|
87
|
+
// Backoff exponentiel avec plafond
|
|
88
|
+
currentBackoff = Math.min(currentBackoff * BACKOFF_MULTIPLIER, BACKOFF_MAX_MS);
|
|
89
|
+
}
|
|
90
|
+
}, currentBackoff);
|
|
91
|
+
};
|
|
92
|
+
const disconnect = () => {
|
|
93
|
+
if (reconnectTimer) {
|
|
94
|
+
clearTimeout(reconnectTimer);
|
|
95
|
+
reconnectTimer = null;
|
|
96
|
+
}
|
|
97
|
+
if (socket) {
|
|
98
|
+
if (instanceId.value) {
|
|
99
|
+
send({ type: 'leave:instance', instanceId: instanceId.value });
|
|
100
|
+
}
|
|
101
|
+
socket.close();
|
|
102
|
+
socket = null;
|
|
103
|
+
}
|
|
104
|
+
isConnected.value = false;
|
|
105
|
+
};
|
|
106
|
+
const send = (data) => {
|
|
107
|
+
if (socket?.readyState === WebSocket.OPEN) {
|
|
108
|
+
socket.send(JSON.stringify(data));
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
// Observation de l'instanceId — reconnexion si changement
|
|
112
|
+
watch(instanceId, (newId) => {
|
|
113
|
+
disconnect();
|
|
114
|
+
if (newId) {
|
|
115
|
+
connect(newId);
|
|
116
|
+
}
|
|
117
|
+
}, { immediate: true });
|
|
118
|
+
onUnmounted(() => {
|
|
119
|
+
isDestroyed = true;
|
|
120
|
+
disconnect();
|
|
121
|
+
});
|
|
122
|
+
// --- API exposée ---
|
|
123
|
+
const onStepChanged = (cb) => on('step_changed', cb);
|
|
124
|
+
const onActionExecuted = (cb) => on('action_executed', cb);
|
|
125
|
+
const onStatusChanged = (cb) => on('status_changed', cb);
|
|
126
|
+
// onConflict : déclenche automatiquement un refresh de l'état
|
|
127
|
+
const onConflict = (cb) => on('workflow:concurrent:conflict', cb);
|
|
128
|
+
return {
|
|
129
|
+
isConnected,
|
|
130
|
+
lastEvent,
|
|
131
|
+
onStepChanged,
|
|
132
|
+
onActionExecuted,
|
|
133
|
+
onStatusChanged,
|
|
134
|
+
onConflict,
|
|
135
|
+
on,
|
|
136
|
+
off,
|
|
137
|
+
disconnect,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=useWorkflowWebSocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWorkflowWebSocket.js","sourceRoot":"","sources":["../../composables/useWorkflowWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAO,MAAM,KAAK,CAAA;AAUlD,uCAAuC;AACvC,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,MAAM,cAAc,GAAG,KAAK,CAAA;AAC5B,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAE5B,MAAM,UAAU,oBAAoB,CAClC,UAA8B,EAC9B,OAA4B;IAE5B,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;IAC9B,MAAM,SAAS,GAAG,GAAG,CAAyB,IAAI,CAAC,CAAA;IAEnD,IAAI,MAAM,GAAqB,IAAI,CAAA;IACnC,IAAI,cAAc,GAAyC,IAAI,CAAA;IAC/D,IAAI,cAAc,GAAG,eAAe,CAAA;IACpC,IAAI,WAAW,GAAG,KAAK,CAAA;IAEvB,8CAA8C;IAC9C,MAAM,SAAS,GAA4B,IAAI,GAAG,EAAE,CAAA;IAEpD,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAY,EAAE,EAAE;QACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACnD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC,CAAA;IAED,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAY,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,IAAI;YAAE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,IAA6B,EAAE,EAAE;QAChE,SAAS,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QACvC,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,CAAA;YACV,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,gDAAgD,KAAK,IAAI,EAAE,GAAG,CAAC,CAAA;YAC/E,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,EAAE;QAC7B,IAAI,WAAW;YAAE,OAAM;QAEvB,wDAAwD;QACxD,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,EAAE,CAAA;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,qBAAqB,CAAA;QACrD,MAAM,GAAG,GAAG,GAAG,KAAK,wBAAwB,EAAE,EAAE,CAAA;QAEhD,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAA;YAC9D,iBAAiB,CAAC,EAAE,CAAC,CAAA;YACrB,OAAM;QACR,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;YACnB,WAAW,CAAC,KAAK,GAAG,IAAI,CAAA;YACxB,cAAc,GAAG,eAAe,CAAA,CAAC,kDAAkD;YAEnF,6CAA6C;YAC7C,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAA;QACjD,CAAC,CAAA;QAED,MAAM,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAoD,CAAA;gBACzF,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,4CAA4C,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YACxE,CAAC;QACH,CAAC,CAAA;QAED,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAA;QAC/D,CAAC,CAAA;QAED,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;YACpB,WAAW,CAAC,KAAK,GAAG,KAAK,CAAA;YAEzB,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;gBACvB,iBAAiB,CAAC,EAAE,CAAC,CAAA;YACvB,CAAC;QACH,CAAC,CAAA;IACH,CAAC,CAAA;IAED,MAAM,iBAAiB,GAAG,CAAC,EAAU,EAAE,EAAE;QACvC,IAAI,WAAW;YAAE,OAAM;QAEvB,IAAI,cAAc;YAAE,YAAY,CAAC,cAAc,CAAC,CAAA;QAEhD,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,CAAC,EAAE,CAAC,CAAA;gBACX,mCAAmC;gBACnC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,kBAAkB,EAAE,cAAc,CAAC,CAAA;YAChF,CAAC;QACH,CAAC,EAAE,cAAc,CAAC,CAAA;IACpB,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,CAAC,cAAc,CAAC,CAAA;YAC5B,cAAc,GAAG,IAAI,CAAA;QACvB,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA;YAChE,CAAC;YACD,MAAM,CAAC,KAAK,EAAE,CAAA;YACd,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;QACD,WAAW,CAAC,KAAK,GAAG,KAAK,CAAA;IAC3B,CAAC,CAAA;IAED,MAAM,IAAI,GAAG,CAAC,IAA6B,EAAE,EAAE;QAC7C,IAAI,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACnC,CAAC;IACH,CAAC,CAAA;IAED,0DAA0D;IAC1D,KAAK,CACH,UAAU,EACV,CAAC,KAAK,EAAE,EAAE;QACR,UAAU,EAAE,CAAA;QACZ,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;IACH,CAAC,EACD,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAA;IAED,WAAW,CAAC,GAAG,EAAE;QACf,WAAW,GAAG,IAAI,CAAA;QAClB,UAAU,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;IAEF,sBAAsB;IAEtB,MAAM,aAAa,GAAG,CAAC,EAAY,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;IAC9D,MAAM,gBAAgB,GAAG,CAAC,EAAY,EAAE,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;IACpE,MAAM,eAAe,GAAG,CAAC,EAAY,EAAE,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;IAElE,8DAA8D;IAC9D,MAAM,UAAU,GAAG,CAAC,EAAY,EAAE,EAAE,CAAC,EAAE,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAA;IAE3E,OAAO;QACL,WAAW;QACX,SAAS;QACT,aAAa;QACb,gBAAgB;QAChB,eAAe;QACf,UAAU;QACV,EAAE;QACF,GAAG;QACH,UAAU;KACX,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export const vWorkflowField = {
|
|
2
|
+
// La directive a besoin d'accéder à l'état fourni par le composable.
|
|
3
|
+
// Cela est complexe car les directives n'ont pas d'accès direct au setup du composant.
|
|
4
|
+
// Une solution est d'utiliser provide/inject.
|
|
5
|
+
// Le composant parent (qui utilise v-workflow-field) doit injecter le `fieldState`
|
|
6
|
+
// ou la directive doit être plus intelligente.
|
|
7
|
+
// Pour l'instant, je vais implémenter une version qui suppose que le `fieldState`
|
|
8
|
+
// est fourni par le contexte du composant.
|
|
9
|
+
// Le WorkflowFormGuard fournira cette fonction.
|
|
10
|
+
beforeMount(el, binding, vnode) {
|
|
11
|
+
// On essaie d'injecter la fonction `fieldState` fournie par un composant parent (WorkflowFormGuard)
|
|
12
|
+
const fieldStateProvider = vnode.appContext?.provides?.workflowFieldState;
|
|
13
|
+
if (typeof fieldStateProvider !== 'function') {
|
|
14
|
+
console.warn('[v-workflow-field] La directive doit être utilisée dans un composant qui fournit "workflowFieldState".');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const fieldName = binding.value;
|
|
18
|
+
const state = fieldStateProvider(fieldName);
|
|
19
|
+
if (state === 'readonly') {
|
|
20
|
+
el.setAttribute('readonly', 'true');
|
|
21
|
+
// Pour les composants Quasar, il faut souvent passer une prop
|
|
22
|
+
if (vnode.component) {
|
|
23
|
+
vnode.component.props.readonly = true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (state === 'disabled') {
|
|
27
|
+
el.setAttribute('disabled', 'true');
|
|
28
|
+
if (vnode.component) {
|
|
29
|
+
vnode.component.props.disable = true;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
// Il faut aussi gérer les mises à jour
|
|
34
|
+
updated(el, binding, vnode) {
|
|
35
|
+
const fieldStateProvider = vnode.appContext?.provides?.workflowFieldState;
|
|
36
|
+
if (typeof fieldStateProvider !== 'function')
|
|
37
|
+
return;
|
|
38
|
+
const fieldName = binding.value;
|
|
39
|
+
const state = fieldStateProvider(fieldName);
|
|
40
|
+
// Reset
|
|
41
|
+
el.removeAttribute('readonly');
|
|
42
|
+
el.removeAttribute('disabled');
|
|
43
|
+
if (vnode.component) {
|
|
44
|
+
vnode.component.props.readonly = false;
|
|
45
|
+
vnode.component.props.disable = false;
|
|
46
|
+
}
|
|
47
|
+
if (state === 'readonly') {
|
|
48
|
+
el.setAttribute('readonly', 'true');
|
|
49
|
+
if (vnode.component)
|
|
50
|
+
vnode.component.props.readonly = true;
|
|
51
|
+
}
|
|
52
|
+
else if (state === 'disabled') {
|
|
53
|
+
el.setAttribute('disabled', 'true');
|
|
54
|
+
if (vnode.component)
|
|
55
|
+
vnode.component.props.disable = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=vWorkflowField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vWorkflowField.js","sourceRoot":"","sources":["../../directives/vWorkflowField.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,qEAAqE;IACrE,uFAAuF;IACvF,8CAA8C;IAC9C,mFAAmF;IACnF,+CAA+C;IAE/C,kFAAkF;IAClF,2CAA2C;IAC3C,gDAAgD;IAEhD,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK;QAC5B,oGAAoG;QACpG,MAAM,kBAAkB,GAAI,KAAK,CAAC,UAAU,EAAE,QAAgB,EAAE,kBAAkB,CAAC;QAEnF,IAAI,OAAO,kBAAkB,KAAK,UAAU,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,wGAAwG,CAAC,CAAC;YACvH,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;QAChC,MAAM,KAAK,GAAe,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAExD,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzB,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpC,8DAA8D;YAC9D,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;YACxC,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK;QACxB,MAAM,kBAAkB,GAAI,KAAK,CAAC,UAAU,EAAE,QAAgB,EAAE,kBAAkB,CAAC;QACnF,IAAI,OAAO,kBAAkB,KAAK,UAAU;YAAE,OAAO;QAErD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;QAChC,MAAM,KAAK,GAAe,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAExD,QAAQ;QACR,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/B,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;YACvC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACxC,CAAC;QAED,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzB,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,SAAS;gBAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC7D,CAAC;aAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,SAAS;gBAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5D,CAAC;IACH,CAAC;CACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './composables/useWorkflow';
|
|
3
|
+
export * from './composables/useWorkflowFieldControl';
|
|
4
|
+
export * from './composables/useWorkflowWebSocket';
|
|
5
|
+
export * from './composables/useWorkflowAdmin';
|
|
6
|
+
export * from './composables/useWorkflowDashboard';
|
|
7
|
+
export * from './composables/useWorkflowStats';
|
|
8
|
+
export * from './composables/useWorkflowDelegation';
|
|
9
|
+
import WorkflowStepper from './components/WorkflowStepper.vue';
|
|
10
|
+
import WorkflowActionBar from './components/WorkflowActionBar.vue';
|
|
11
|
+
import WorkflowFormGuard from './components/WorkflowFormGuard.vue';
|
|
12
|
+
import WorkflowHistory from './components/WorkflowHistory.vue';
|
|
13
|
+
import WorkflowDashboard from './components/WorkflowDashboard.vue';
|
|
14
|
+
import WorkflowTracking from './components/WorkflowTracking.vue';
|
|
15
|
+
import WorkflowAdminMonitor from './components/WorkflowAdminMonitor.vue';
|
|
16
|
+
import WorkflowStats from './components/WorkflowStats.vue';
|
|
17
|
+
import WorkflowDelegationManager from './components/WorkflowDelegationManager.vue';
|
|
18
|
+
import WorkflowAdminBuilder from './components/WorkflowAdminBuilder.vue';
|
|
19
|
+
import WorkflowTransitionEditor from './components/WorkflowTransitionEditor.vue';
|
|
20
|
+
import RuleBuilderWidget from './components/RuleBuilderWidget.vue';
|
|
21
|
+
export { WorkflowStepper, WorkflowActionBar, WorkflowFormGuard, WorkflowHistory, WorkflowDashboard, WorkflowTracking, WorkflowAdminMonitor, WorkflowStats, WorkflowDelegationManager, WorkflowAdminBuilder, WorkflowTransitionEditor, RuleBuilderWidget, };
|
|
22
|
+
export * from './plugins/WorkflowPlugin';
|
|
23
|
+
export * from './directives/vWorkflowField';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Types
|
|
2
|
+
export * from './types';
|
|
3
|
+
// Composables
|
|
4
|
+
export * from './composables/useWorkflow';
|
|
5
|
+
export * from './composables/useWorkflowFieldControl';
|
|
6
|
+
export * from './composables/useWorkflowWebSocket';
|
|
7
|
+
export * from './composables/useWorkflowAdmin';
|
|
8
|
+
export * from './composables/useWorkflowDashboard';
|
|
9
|
+
export * from './composables/useWorkflowStats';
|
|
10
|
+
export * from './composables/useWorkflowDelegation';
|
|
11
|
+
// Composants
|
|
12
|
+
import WorkflowStepper from './components/WorkflowStepper.vue';
|
|
13
|
+
import WorkflowActionBar from './components/WorkflowActionBar.vue';
|
|
14
|
+
import WorkflowFormGuard from './components/WorkflowFormGuard.vue';
|
|
15
|
+
import WorkflowHistory from './components/WorkflowHistory.vue';
|
|
16
|
+
import WorkflowDashboard from './components/WorkflowDashboard.vue';
|
|
17
|
+
import WorkflowTracking from './components/WorkflowTracking.vue';
|
|
18
|
+
import WorkflowAdminMonitor from './components/WorkflowAdminMonitor.vue';
|
|
19
|
+
import WorkflowStats from './components/WorkflowStats.vue';
|
|
20
|
+
import WorkflowDelegationManager from './components/WorkflowDelegationManager.vue';
|
|
21
|
+
import WorkflowAdminBuilder from './components/WorkflowAdminBuilder.vue';
|
|
22
|
+
import WorkflowTransitionEditor from './components/WorkflowTransitionEditor.vue';
|
|
23
|
+
import RuleBuilderWidget from './components/RuleBuilderWidget.vue';
|
|
24
|
+
export { WorkflowStepper, WorkflowActionBar, WorkflowFormGuard, WorkflowHistory, WorkflowDashboard, WorkflowTracking, WorkflowAdminMonitor, WorkflowStats, WorkflowDelegationManager, WorkflowAdminBuilder, WorkflowTransitionEditor, RuleBuilderWidget, };
|
|
25
|
+
// Plugin
|
|
26
|
+
export * from './plugins/WorkflowPlugin';
|
|
27
|
+
// Directive
|
|
28
|
+
export * from './directives/vWorkflowField';
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,SAAS,CAAA;AAEvB,cAAc;AACd,cAAc,2BAA2B,CAAA;AACzC,cAAc,uCAAuC,CAAA;AACrD,cAAc,oCAAoC,CAAA;AAClD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,oCAAoC,CAAA;AAClD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,qCAAqC,CAAA;AAEnD,aAAa;AACb,OAAO,eAAe,MAAM,kCAAkC,CAAA;AAC9D,OAAO,iBAAiB,MAAM,oCAAoC,CAAA;AAClE,OAAO,iBAAiB,MAAM,oCAAoC,CAAA;AAClE,OAAO,eAAe,MAAM,kCAAkC,CAAA;AAC9D,OAAO,iBAAiB,MAAM,oCAAoC,CAAA;AAClE,OAAO,gBAAgB,MAAM,mCAAmC,CAAA;AAChE,OAAO,oBAAoB,MAAM,uCAAuC,CAAA;AACxE,OAAO,aAAa,MAAM,gCAAgC,CAAA;AAC1D,OAAO,yBAAyB,MAAM,4CAA4C,CAAA;AAClF,OAAO,oBAAoB,MAAM,uCAAuC,CAAA;AACxE,OAAO,wBAAwB,MAAM,2CAA2C,CAAA;AAChF,OAAO,iBAAiB,MAAM,oCAAoC,CAAA;AAElE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,GAClB,CAAA;AAED,SAAS;AACT,cAAc,0BAA0B,CAAA;AAExC,YAAY;AACZ,cAAc,6BAA6B,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import WorkflowStepper from '../components/WorkflowStepper.vue';
|
|
2
|
+
import WorkflowActionBar from '../components/WorkflowActionBar.vue';
|
|
3
|
+
import WorkflowFormGuard from '../components/WorkflowFormGuard.vue';
|
|
4
|
+
import WorkflowHistory from '../components/WorkflowHistory.vue';
|
|
5
|
+
import WorkflowDashboard from '../components/WorkflowDashboard.vue';
|
|
6
|
+
import WorkflowTracking from '../components/WorkflowTracking.vue';
|
|
7
|
+
import WorkflowAdminMonitor from '../components/WorkflowAdminMonitor.vue';
|
|
8
|
+
import WorkflowStats from '../components/WorkflowStats.vue';
|
|
9
|
+
import WorkflowDelegationManager from '../components/WorkflowDelegationManager.vue';
|
|
10
|
+
import WorkflowAdminBuilder from '../components/WorkflowAdminBuilder.vue';
|
|
11
|
+
import WorkflowTransitionEditor from '../components/WorkflowTransitionEditor.vue';
|
|
12
|
+
import RuleBuilderWidget from '../components/RuleBuilderWidget.vue';
|
|
13
|
+
import { vWorkflowField } from '../directives/vWorkflowField';
|
|
14
|
+
export const WorkflowPlugin = {
|
|
15
|
+
install(app, options = {}) {
|
|
16
|
+
// Injection de la configuration — consommée via inject() dans tous les composables
|
|
17
|
+
app.provide('workflowApiBase', options.apiBase ?? '/api/workflow');
|
|
18
|
+
app.provide('workflowWsUrl', options.wsUrl ?? 'ws://localhost:3333');
|
|
19
|
+
// Enregistrement global des composants
|
|
20
|
+
app.component('WorkflowStepper', WorkflowStepper);
|
|
21
|
+
app.component('WorkflowActionBar', WorkflowActionBar);
|
|
22
|
+
app.component('WorkflowFormGuard', WorkflowFormGuard);
|
|
23
|
+
app.component('WorkflowHistory', WorkflowHistory);
|
|
24
|
+
app.component('WorkflowDashboard', WorkflowDashboard);
|
|
25
|
+
app.component('WorkflowTracking', WorkflowTracking);
|
|
26
|
+
app.component('WorkflowAdminMonitor', WorkflowAdminMonitor);
|
|
27
|
+
app.component('WorkflowStats', WorkflowStats);
|
|
28
|
+
app.component('WorkflowDelegationManager', WorkflowDelegationManager);
|
|
29
|
+
app.component('WorkflowAdminBuilder', WorkflowAdminBuilder);
|
|
30
|
+
app.component('WorkflowTransitionEditor', WorkflowTransitionEditor);
|
|
31
|
+
app.component('RuleBuilderWidget', RuleBuilderWidget);
|
|
32
|
+
// Enregistrement global de la directive v-workflow-field
|
|
33
|
+
app.directive('workflow-field', vWorkflowField);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=WorkflowPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowPlugin.js","sourceRoot":"","sources":["../../plugins/WorkflowPlugin.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,mCAAmC,CAAA;AAC/D,OAAO,iBAAiB,MAAM,qCAAqC,CAAA;AACnE,OAAO,iBAAiB,MAAM,qCAAqC,CAAA;AACnE,OAAO,eAAe,MAAM,mCAAmC,CAAA;AAC/D,OAAO,iBAAiB,MAAM,qCAAqC,CAAA;AACnE,OAAO,gBAAgB,MAAM,oCAAoC,CAAA;AACjE,OAAO,oBAAoB,MAAM,wCAAwC,CAAA;AACzE,OAAO,aAAa,MAAM,iCAAiC,CAAA;AAC3D,OAAO,yBAAyB,MAAM,6CAA6C,CAAA;AACnF,OAAO,oBAAoB,MAAM,wCAAwC,CAAA;AACzE,OAAO,wBAAwB,MAAM,4CAA4C,CAAA;AACjF,OAAO,iBAAiB,MAAM,qCAAqC,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAU7D,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,OAAO,CAAC,GAAQ,EAAE,UAAiC,EAAE;QACnD,mFAAmF;QACnF,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,CAAA;QAClE,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAA;QAEpE,uCAAuC;QACvC,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;QACjD,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAA;QACrD,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAA;QACrD,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;QACjD,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAA;QACrD,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;QACnD,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,CAAA;QAC3D,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,aAAa,CAAC,CAAA;QAC7C,GAAG,CAAC,SAAS,CAAC,2BAA2B,EAAE,yBAAyB,CAAC,CAAA;QACrE,GAAG,CAAC,SAAS,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,CAAA;QAC3D,GAAG,CAAC,SAAS,CAAC,0BAA0B,EAAE,wBAAwB,CAAC,CAAA;QACnE,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAA;QAErD,yDAAyD;QACzD,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAA;IACjD,CAAC;CACF,CAAA"}
|