@communecter/cocolight-api-client 1.0.163 → 1.0.167
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/dist/1494.cocolight-api-client.browser.js +1 -1
- package/dist/1494.cocolight-api-client.cjs +1 -1
- package/dist/1641.cocolight-api-client.browser.js +1 -1
- package/dist/1641.cocolight-api-client.cjs +1 -1
- package/dist/2041.cocolight-api-client.browser.js +1 -1
- package/dist/2041.cocolight-api-client.cjs +1 -1
- package/dist/2302.cocolight-api-client.browser.js +1 -1
- package/dist/2302.cocolight-api-client.cjs +1 -1
- package/dist/2313.cocolight-api-client.browser.js +1 -1
- package/dist/2313.cocolight-api-client.cjs +1 -1
- package/dist/2594.cocolight-api-client.browser.js +1 -1
- package/dist/2594.cocolight-api-client.cjs +1 -1
- package/dist/2766.cocolight-api-client.browser.js +1 -1
- package/dist/2766.cocolight-api-client.cjs +1 -1
- package/dist/3330.cocolight-api-client.browser.js +1 -1
- package/dist/3330.cocolight-api-client.cjs +1 -1
- package/dist/3764.cocolight-api-client.browser.js +1 -1
- package/dist/3764.cocolight-api-client.cjs +1 -1
- package/dist/3873.cocolight-api-client.browser.js +1 -1
- package/dist/3873.cocolight-api-client.cjs +1 -1
- package/dist/4031.cocolight-api-client.browser.js +1 -1
- package/dist/4031.cocolight-api-client.cjs +1 -1
- package/dist/5286.cocolight-api-client.browser.js +1 -1
- package/dist/5286.cocolight-api-client.cjs +1 -1
- package/dist/5541.cocolight-api-client.browser.js +1 -1
- package/dist/5541.cocolight-api-client.cjs +1 -1
- package/dist/601.cocolight-api-client.browser.js +1 -1
- package/dist/601.cocolight-api-client.cjs +1 -1
- package/dist/6369.cocolight-api-client.browser.js +1 -1
- package/dist/6369.cocolight-api-client.cjs +1 -1
- package/dist/7009.cocolight-api-client.browser.js +1 -1
- package/dist/7009.cocolight-api-client.cjs +1 -1
- package/dist/8300.cocolight-api-client.browser.js +1 -1
- package/dist/8300.cocolight-api-client.cjs +1 -1
- package/dist/8894.cocolight-api-client.browser.js +1 -1
- package/dist/8894.cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.browser.js +6 -6
- package/dist/cocolight-api-client.cjs +1 -1
- package/dist/cocolight-api-client.vite.mjs.js +1 -1
- package/dist/cocolight-api-client.vite.mjs.js.map +1 -1
- package/package.json +1 -1
- package/types/api/BaseEntity.d.ts +90 -6
- package/types/api/EndpointApi.d.ts +11 -1
- package/types/api/EndpointApi.types.d.ts +74 -2
- package/types/api/User.d.ts +15 -4
- package/types/costum/liveDigest.d.ts +85 -0
- package/types/costum/runtime-map.d.ts +12 -2
- package/types/costum/runtime.d.ts +54 -13
- package/types/costum/types.d.ts +13 -0
- package/types/endpoints.module.d.ts +615 -296
- package/types/index.d.ts +1 -0
package/package.json
CHANGED
|
@@ -708,6 +708,48 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
708
708
|
* await news.deleteFile(imageDocId);
|
|
709
709
|
*/
|
|
710
710
|
deleteFile(docId: string): Promise<void>;
|
|
711
|
+
/**
|
|
712
|
+
* Champs de contexte costum à joindre à un upload multipart (profil/bannière/galerie) pour que le
|
|
713
|
+
* backend stampe `source.key` (Document.php:228-232). Dérivés de `_costumCtx` (résolu du `source.key`
|
|
714
|
+
* de l'élément) → un POI scopé "parent62" envoie `costumSlug="parent62"`. `{}` hors contexte costum.
|
|
715
|
+
*/
|
|
716
|
+
protected _costumUploadFields(): {
|
|
717
|
+
costumSlug?: string;
|
|
718
|
+
costumId?: string;
|
|
719
|
+
costumType?: string;
|
|
720
|
+
};
|
|
721
|
+
/**
|
|
722
|
+
* Uploade un document (image/fichier) rattaché à CET élément, avec `contentKey`/`docType`
|
|
723
|
+
* PARAMÉTRABLES — ex. `contentKey:"slider"` pour une galerie (Option C). La provenance costum
|
|
724
|
+
* (`source.key`) est injectée automatiquement depuis `_costumCtx` (résolu du `source.key` de
|
|
725
|
+
* l'élément). L'élément DOIT préexister (pas d'auto-création, contraste avec `Answer.uploadFile`).
|
|
726
|
+
* Endpoint générique `UPLOAD_DOCUMENT` (backend `co2/document/upload-save`, route wildcard).
|
|
727
|
+
*
|
|
728
|
+
* STATELESS : ne rafraîchit PAS `serverData` (pas de push local façon `News.addImage`). Pour refléter
|
|
729
|
+
* la nouvelle image dans `getGalleryImages()`, re-fetch l'élément via `about` après upload (le
|
|
730
|
+
* consommateur peut afficher optimistement via le `docPath` retourné en attendant). Cf. patron
|
|
731
|
+
* `Answer.processUploads` : la galerie s'uploade APRÈS `save()` (l'élément doit avoir un `id`).
|
|
732
|
+
*
|
|
733
|
+
* @returns `{ docId, docPath }` — id du document créé + URL relative servie.
|
|
734
|
+
* @throws {ApiError} 404 si l'entité n'est pas enregistrée (pas d'`id`).
|
|
735
|
+
*/
|
|
736
|
+
uploadDocument(file: UploadInput, opts: {
|
|
737
|
+
contentKey: string;
|
|
738
|
+
docType?: "image" | "file";
|
|
739
|
+
subKey?: string;
|
|
740
|
+
folder?: string;
|
|
741
|
+
ownerId?: string;
|
|
742
|
+
}): Promise<{
|
|
743
|
+
docId: string;
|
|
744
|
+
docPath: string;
|
|
745
|
+
}>;
|
|
746
|
+
/**
|
|
747
|
+
* Images d'une galerie de CET élément, lues depuis le champ `images` fusionné par `about`/getById
|
|
748
|
+
* (backend `enrichAbout` — {Poi,Classified}::getById), filtrées par `contentKey` (défaut `"slider"`).
|
|
749
|
+
* SYNCHRONE : nécessite que l'entité ait été chargée via `about` (sinon `[]`). Forme = getListOfImage
|
|
750
|
+
* (`{ id, _id, contentKey, imagePath, imageThumbPath, imageMediumPath, subKey, name, ... }`).
|
|
751
|
+
*/
|
|
752
|
+
getGalleryImages(contentKey?: string): Array<Record<string, unknown>>;
|
|
711
753
|
/**
|
|
712
754
|
* Liste les documents (images/fichiers) attachés à CETTE entité (`id` + `type`) via `DOCUMENT_LIST`
|
|
713
755
|
* (port legacy `document/list`). Renvoie un tableau plat `{ id, name, path, author, contentKey }`.
|
|
@@ -721,6 +763,26 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
721
763
|
author?: string;
|
|
722
764
|
contentKey?: string;
|
|
723
765
|
}>>;
|
|
766
|
+
/**
|
|
767
|
+
* Liste les FICHIERS (documents non-image, `doctype:"file"`) attachés à CETTE entité via `GET_GALLERY`
|
|
768
|
+
* (`co2/gallery/index`, branche fichier : `docs` = OBJET keyé par `_id`, records BRUTS + `docPath`
|
|
769
|
+
* absolutisé par `_imageFields`). Source UNIQUE et uniforme tous types (org/projet/citoyen/poi/events/
|
|
770
|
+
* classifieds — l'`IndexAction` legacy est type-agnostique). Contraste `getGalleryImages` (images,
|
|
771
|
+
* synchrone via `about`) et `getDocuments` (DOCUMENT_LIST, forme réduite sans `size`/`docType`, `path`
|
|
772
|
+
* = dossier seul). Les fichiers rangés en dossier (`folderId`) sont exclus par défaut (parité
|
|
773
|
+
* `IndexAction` : `folderId:{$exists:false}`).
|
|
774
|
+
*
|
|
775
|
+
* @returns `{ docId, docPath, name, size, contentKey }[]` — `contentKey` = valeur DÉRIVÉE stockée
|
|
776
|
+
* (`pdf`/`spreadsheet`/`text`/`presentation`), utilisable pour choisir l'icône.
|
|
777
|
+
* @throws {ApiError} 404 si l'entité n'est pas enregistrée.
|
|
778
|
+
*/
|
|
779
|
+
getGalleryFiles(): Promise<Array<{
|
|
780
|
+
docId: string;
|
|
781
|
+
docPath?: string;
|
|
782
|
+
name?: string;
|
|
783
|
+
size?: number;
|
|
784
|
+
contentKey?: string;
|
|
785
|
+
}>>;
|
|
724
786
|
/**
|
|
725
787
|
* Supprime l'image de PROFIL de cette entité : récupère le `docId` du document `contentKey:"profil"`
|
|
726
788
|
* (via `getDocuments`) puis `deleteFile`. No-op (`false`) s'il n'y a pas d'image. Pendant exact de
|
|
@@ -742,6 +804,20 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
742
804
|
* @protected
|
|
743
805
|
*/
|
|
744
806
|
protected _markDeletedLocally(): void;
|
|
807
|
+
/** Droit d'ADMIN DE COSTUM pré-résolu par l'appelant (ex. site-json /admin via `me.isCostumAdmin(slug)`). */
|
|
808
|
+
protected _costumAdminAuthorized: boolean;
|
|
809
|
+
/**
|
|
810
|
+
* Marque cette instance comme éditable/supprimable au titre du droit-parapluie COSTUM. À poser par
|
|
811
|
+
* l'appelant qui a DÉJÀ résolu `me.isCostumAdmin(slug)` (async) — les gardes client d'édition (`_update`)
|
|
812
|
+
* et de suppression (`_deleteViaElement`) le respectent alors. Le backend reste la source de vérité
|
|
813
|
+
* (canEditItem/canDeleteElement portent isCostumAdmin), ceci n'ouvre QUE le pré-check client.
|
|
814
|
+
*/
|
|
815
|
+
setCostumAdminAuthorized(v?: boolean): this;
|
|
816
|
+
/**
|
|
817
|
+
* Droit de gestion « élevé » côté client : super-admin (via userContext) OU admin de costum pré-résolu.
|
|
818
|
+
* Utilisé par les gardes `_update`/`_deleteViaElement` pour ne pas bloquer une action que le backend autorise.
|
|
819
|
+
*/
|
|
820
|
+
protected _hasElevatedManageRight(): boolean;
|
|
745
821
|
/**
|
|
746
822
|
* Suppression générique d'un élément via `DELETE_ELEMENT`
|
|
747
823
|
* (`/co2/element/delete/type/{type}/id/{id}`).
|
|
@@ -1746,12 +1822,12 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
1746
1822
|
* donc aucun `_costumCtx`) aux méthodes qui l'exigent (`_requireCostumCtx` : `previewImport`,
|
|
1747
1823
|
* `importElements`, `exportElements`, `addReference`…).
|
|
1748
1824
|
*
|
|
1749
|
-
* Résolution :
|
|
1750
|
-
* 1.
|
|
1751
|
-
*
|
|
1752
|
-
*
|
|
1753
|
-
*
|
|
1754
|
-
*
|
|
1825
|
+
* Résolution (`resolveCostumCtxFromSource`, LIVE-FIRST) :
|
|
1826
|
+
* 1. cache costum LIVE frais (via un `prefetchCostums`/`loadCostumScope` préalable) — champs inclus ;
|
|
1827
|
+
* 2. sinon le REGISTRE bundlé (warm-start) ;
|
|
1828
|
+
* 3. sinon un contexte NU construit depuis `opts` (costum hors cache/registre — schema vide, fields:[]) ;
|
|
1829
|
+
* 4. sinon throw (identité costum introuvable). NB : pour un costum hors registre AVEC ses champs,
|
|
1830
|
+
* préférer `loadCostumScope(slug)` (async) qui fetche `getcostumjson`.
|
|
1755
1831
|
*
|
|
1756
1832
|
* Remplace la mutation externe de `_costumCtx` pratiquée par les fronts (champ INTERNE non
|
|
1757
1833
|
* contractuel) — cf. site-json `ensureCostumScope`, à migrer sur cette méthode.
|
|
@@ -1764,6 +1840,14 @@ export declare class BaseEntity<TServerData = any> {
|
|
|
1764
1840
|
costumId?: string;
|
|
1765
1841
|
costumType?: string;
|
|
1766
1842
|
}): void;
|
|
1843
|
+
/**
|
|
1844
|
+
* Charge EN LIVE (via `getcostumjson`) le scope costum d'un slug HORS registre bundlé et pose le
|
|
1845
|
+
* contexte COMPLET (champs/presets/hidden) sur cette entité — pour l'ÉDITER avec ses champs costum
|
|
1846
|
+
* sans re-publier la lib (RFC fil C / option 3bis, comble l'édition vide). Contrairement à
|
|
1847
|
+
* `setCostumScope` (sync, registre/ctx nu), digère le typeObj du costum. No-op si le costum ne
|
|
1848
|
+
* couvre pas la collection de l'entité. Idempotent (cache session par slug).
|
|
1849
|
+
*/
|
|
1850
|
+
loadCostumScope(slug: string): Promise<boolean>;
|
|
1767
1851
|
/**
|
|
1768
1852
|
* Contexte costum de CETTE entité (résolu de son `source.key`) — requis par l'import/export admin.
|
|
1769
1853
|
* @throws {ApiError} si l'entité n'est pas rattachée à un costum.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type ApiClient from "../ApiClient.js";
|
|
2
|
-
import type { DocumentListData, PersonRegisterData, AuthenticateUrlData, RefreshTokenUrlData, PasswordRecoveryData, ServerExchangeTokenData, ChangePasswordData, DeleteAccountData, UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, UpdateBlockSlugData, CheckData, ProfilImageData, ProfilBannerData, GetElementsAboutData, MulticonnectData, GetNewsData, GetNewsByIdData, AddNewsData, AddImageNewsData, AddFileNewsData, DeleteNewsData, UpdateNewsData, ShareNewsData, GetCommentsData, AddCommentsData, DeleteCommentsData, UpdateCommentsData, SearchTagsData, ShowVoteData, GlobalAutocompleteData, CityAutocompleteData, CityAutocompleteByCountryData, SuggestionInputData, GetProjectsNoAdminData, GetProjectsAdminData, GetPoisNoAdminData, GetPoisAdminData, GlobalAutocompleteAdminCostumData, GetOrganizationsNoAdminData, GetOrganizationsAdminData, GetUserEligiblePlacesData, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, AddProjectData, AddPoiData, AddEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, SearchEventsCostumData, ShareEventsData, InviteMembersData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, NavigatorGettlData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, DeleteCoformAnswerFileData, CoformGetAnswerFilesData, GetCoformCatalogsData, SaveCoformAnswerData, GetCoformAnswerHistoryData, GetCoformMultievalDataData, GetCoformCommontableContributorsData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, GenerateAnswerFromFormData, FundingEnvelopeData, CoremuOperationData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData, PersonActivateData, ImportPreviewData, ExportElementsData, ImportElementsData, GeocodageData, ValidateGroupData, SetSourceData, ModerateData, NewsModerateData, CommentModerateData } from "./EndpointApi.types.js";
|
|
2
|
+
import type { DocumentListData, PersonRegisterData, AuthenticateUrlData, RefreshTokenUrlData, PasswordRecoveryData, ServerExchangeTokenData, ChangePasswordData, DeleteAccountData, UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, UpdateBlockSlugData, CheckData, ProfilImageData, ProfilBannerData, GetElementsAboutData, MulticonnectData, GetNewsData, GetNewsByIdData, AddNewsData, AddImageNewsData, AddFileNewsData, DeleteNewsData, UpdateNewsData, ShareNewsData, GetCommentsData, AddCommentsData, DeleteCommentsData, UpdateCommentsData, SearchTagsData, ShowVoteData, GlobalAutocompleteData, CityAutocompleteData, CityAutocompleteByCountryData, SuggestionInputData, GetProjectsNoAdminData, GetProjectsAdminData, GetPoisNoAdminData, GetPoisAdminData, GlobalAutocompleteAdminCostumData, GetOrganizationsNoAdminData, GetOrganizationsAdminData, GetUserEligiblePlacesData, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, AddProjectData, AddPoiData, AddEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, SearchEventsCostumData, ShareEventsData, InviteMembersData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, NavigatorGettlData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, DeleteCoformAnswerFileData, CoformGetAnswerFilesData, GetCoformCatalogsData, SaveCoformAnswerData, GetCoformAnswerHistoryData, GetCoformMultievalDataData, GetCoformCommontableContributorsData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, GenerateAnswerFromFormData, FundingEnvelopeData, CoremuOperationData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData, PersonActivateData, ImportPreviewData, ExportElementsData, ImportElementsData, GeocodageData, ValidateGroupData, SetSourceData, ModerateData, NewsModerateData, CommentModerateData, UploadDocumentData } from "./EndpointApi.types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Classe EndpointApi générée automatiquement depuis endpoints-copie.json
|
|
5
5
|
*/
|
|
@@ -1502,5 +1502,15 @@ export declare class EndpointApi {
|
|
|
1502
1502
|
* @throws {Error} - En cas d'erreur inattendue.
|
|
1503
1503
|
*/
|
|
1504
1504
|
commentModerate(data: CommentModerateData): Promise<any>;
|
|
1505
|
+
/**
|
|
1506
|
+
* Uploader un document/image sur un élément (galerie) : Uploade un document (image/fichier) rattaché à un ÉLÉMENT, avec docType/contentKey PARAMÉTRABLES (ex. contentKey=slider pour une galerie) et provenance costum optionnelle (costumSlug/costumId/costumType stampent source.key). Backend: co2/document/upload-save (route wildcard, parseKv). L'élément doit préexister.
|
|
1507
|
+
* Constant : UPLOAD_DOCUMENT
|
|
1508
|
+
* @param data - Données envoyées à l'API
|
|
1509
|
+
* @returns Les données de réponse.
|
|
1510
|
+
* @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
|
|
1511
|
+
* @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
|
|
1512
|
+
* @throws {Error} - En cas d'erreur inattendue.
|
|
1513
|
+
*/
|
|
1514
|
+
uploadDocument(data: UploadDocumentData): Promise<any>;
|
|
1505
1515
|
}
|
|
1506
1516
|
export default EndpointApi;
|
|
@@ -364,6 +364,18 @@ export interface ProfilImageData {
|
|
|
364
364
|
profil_avatar: {
|
|
365
365
|
[k: string]: unknown;
|
|
366
366
|
};
|
|
367
|
+
/**
|
|
368
|
+
* Slug du costum actif (stampe source.key côté backend) — optionnel
|
|
369
|
+
*/
|
|
370
|
+
costumSlug?: string;
|
|
371
|
+
/**
|
|
372
|
+
* ID du contexte costum — optionnel
|
|
373
|
+
*/
|
|
374
|
+
costumId?: string;
|
|
375
|
+
/**
|
|
376
|
+
* Type (collection) du contexte costum — optionnel
|
|
377
|
+
*/
|
|
378
|
+
costumType?: string;
|
|
367
379
|
pathParams?: {
|
|
368
380
|
/**
|
|
369
381
|
* Type d'entité
|
|
@@ -391,6 +403,18 @@ export interface ProfilBannerData {
|
|
|
391
403
|
cropH: number;
|
|
392
404
|
cropX: number;
|
|
393
405
|
cropY: number;
|
|
406
|
+
/**
|
|
407
|
+
* Slug du costum actif (stampe source.key côté backend) — optionnel
|
|
408
|
+
*/
|
|
409
|
+
costumSlug?: string;
|
|
410
|
+
/**
|
|
411
|
+
* ID du contexte costum — optionnel
|
|
412
|
+
*/
|
|
413
|
+
costumId?: string;
|
|
414
|
+
/**
|
|
415
|
+
* Type (collection) du contexte costum — optionnel
|
|
416
|
+
*/
|
|
417
|
+
costumType?: string;
|
|
394
418
|
pathParams?: {
|
|
395
419
|
/**
|
|
396
420
|
* Type d'entité
|
|
@@ -4912,9 +4936,9 @@ export interface GetGalleryData {
|
|
|
4912
4936
|
*/
|
|
4913
4937
|
id: string;
|
|
4914
4938
|
/**
|
|
4915
|
-
* Type d'entité
|
|
4939
|
+
* Type d'entité (IndexAction legacy est type-agnostique ; poi/events/classifieds ajoutés pour la lecture des documents/fichiers via getGalleryFiles)
|
|
4916
4940
|
*/
|
|
4917
|
-
type: "citoyens" | "organizations" | "projects";
|
|
4941
|
+
type: "citoyens" | "organizations" | "projects" | "poi" | "events" | "classifieds";
|
|
4918
4942
|
/**
|
|
4919
4943
|
* Type de document
|
|
4920
4944
|
*/
|
|
@@ -6348,3 +6372,51 @@ export interface CommentModerateData {
|
|
|
6348
6372
|
isAnAbuse?: "true" | "false";
|
|
6349
6373
|
[k: string]: unknown;
|
|
6350
6374
|
}
|
|
6375
|
+
export interface UploadDocumentData {
|
|
6376
|
+
/**
|
|
6377
|
+
* Fichier à uploader
|
|
6378
|
+
*/
|
|
6379
|
+
qqfile: {
|
|
6380
|
+
[k: string]: unknown;
|
|
6381
|
+
};
|
|
6382
|
+
/**
|
|
6383
|
+
* Slug du costum actif (stampe source.key=costumSlug)
|
|
6384
|
+
*/
|
|
6385
|
+
costumSlug?: string;
|
|
6386
|
+
/**
|
|
6387
|
+
* ID du contexte costum
|
|
6388
|
+
*/
|
|
6389
|
+
costumId?: string;
|
|
6390
|
+
/**
|
|
6391
|
+
* Type (collection) du contexte costum
|
|
6392
|
+
*/
|
|
6393
|
+
costumType?: string;
|
|
6394
|
+
/**
|
|
6395
|
+
* Sous-clé de galerie (optionnelle)
|
|
6396
|
+
*/
|
|
6397
|
+
subKey?: string;
|
|
6398
|
+
/**
|
|
6399
|
+
* Dossier d'album cible (optionnel)
|
|
6400
|
+
*/
|
|
6401
|
+
folderId?: string;
|
|
6402
|
+
pathParams?: {
|
|
6403
|
+
/**
|
|
6404
|
+
* Type (collection) de l'élément porteur
|
|
6405
|
+
*/
|
|
6406
|
+
folder: "citoyens" | "projects" | "organizations" | "events" | "poi" | "classifieds";
|
|
6407
|
+
/**
|
|
6408
|
+
* ID de l'élément porteur (doit exister)
|
|
6409
|
+
*/
|
|
6410
|
+
ownerId: string;
|
|
6411
|
+
/**
|
|
6412
|
+
* Nature du document
|
|
6413
|
+
*/
|
|
6414
|
+
docType: "image" | "file";
|
|
6415
|
+
/**
|
|
6416
|
+
* Clé de contenu (ex: 'slider' pour galerie, 'file', 'profil', 'banner'...)
|
|
6417
|
+
*/
|
|
6418
|
+
contentKey: string;
|
|
6419
|
+
[k: string]: unknown;
|
|
6420
|
+
};
|
|
6421
|
+
[k: string]: unknown;
|
|
6422
|
+
}
|
package/types/api/User.d.ts
CHANGED
|
@@ -70,15 +70,26 @@ export declare class User extends BaseEntity<UserItemNormalized> {
|
|
|
70
70
|
*/
|
|
71
71
|
isSuperAdmin(): boolean;
|
|
72
72
|
/**
|
|
73
|
-
* Admin de plateforme (`roles.adminPlatform === true`).
|
|
74
|
-
*
|
|
73
|
+
* Admin de plateforme (`roles.adminPlatform === true`). Rôle hors-legacy (absent du PHP), posé en base.
|
|
74
|
+
* NB : le backend NE le traite PLUS comme super-admin (retiré de `isUserSuperAdmin` pour byte-fidélité) —
|
|
75
|
+
* ne l'utiliser que pour des features plateforme dédiées, pas pour gater une action que le backend refusera.
|
|
75
76
|
*/
|
|
76
77
|
isAdminPlatform(): boolean;
|
|
77
78
|
/**
|
|
78
|
-
* Accès admin plateforme large : `superAdmin || adminPlatform
|
|
79
|
-
*
|
|
79
|
+
* Accès admin plateforme large : `superAdmin || adminPlatform`. Pour gater l'UI d'outils plateforme.
|
|
80
|
+
* ⚠ Le backend n'accorde l'édition/suppression qu'au `superAdmin` strict (+ droits costum) — un
|
|
81
|
+
* `adminPlatform` pur verra l'UI mais sera refusé au save/delete.
|
|
80
82
|
*/
|
|
81
83
|
canPlatformAdmin(): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* L'utilisateur connecté est-il ADMIN DU COSTUM `slug` (droit-parapluie back-office) ? = admin (lien
|
|
86
|
+
* `isAdmin` validé) de l'élément HÔTE du costum. Pendant client de `Authorisation::isCostumAdmin` :
|
|
87
|
+
* résout le host via `getElementsKey` (slug → contextId/contextType) puis lit
|
|
88
|
+
* `me.links.<memberOf|projects|events>[hostId].isAdmin`.
|
|
89
|
+
* ⚠ ASYNC (1 requête) : à résoudre UNE fois par contexte /admin, PAS par ligne de liste.
|
|
90
|
+
* NB : ne couvre pas le fallback `costum.admins` (rare) — seul le chemin admin-du-host est vérifié client-side.
|
|
91
|
+
*/
|
|
92
|
+
isCostumAdmin(slug: string): Promise<boolean>;
|
|
82
93
|
/**
|
|
83
94
|
* Récupère le profil complet de l'utilisateur.
|
|
84
95
|
* Si l'utilisateur est connecté, on appelle le endpoint ME_INFO_URL,
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Digestion RUNTIME d'un costum servi par `getcostumjson` (format legacy brut) en
|
|
3
|
+
* `CostumRuntimeContext` par collection — permet de résoudre un costum HORS du registre bundlé sans
|
|
4
|
+
* re-publication (RFC doc/31 fil C, option 3bis). Port fidèle de `tools/parity/scripts/costum-fields.mjs`
|
|
5
|
+
* (backend), SANS l'inférence de type par valeurs stockées (pas d'accès base côté client ; en pratique
|
|
6
|
+
* inutile — `setType` BSON natif ne concerne aucun costum déployé). Le type reste DÉCLARÉ (inputType/
|
|
7
|
+
* rules), l'enum vient de `lists`, la multiplicité de la config.
|
|
8
|
+
*/
|
|
9
|
+
import type { CostumRuntimeContext } from "./runtime.js";
|
|
10
|
+
import type { Collection } from "./types.js";
|
|
11
|
+
/** Sous-objet `costum` renvoyé par `getcostumjson` (data). Champs utiles à la digestion. */
|
|
12
|
+
export interface CostumJsonData {
|
|
13
|
+
slug?: string;
|
|
14
|
+
typeObj?: Record<string, TypeObjNode>;
|
|
15
|
+
lists?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
interface TypeObjNode {
|
|
18
|
+
sameAs?: string;
|
|
19
|
+
add?: boolean;
|
|
20
|
+
createLabel?: string;
|
|
21
|
+
dynFormCostum?: {
|
|
22
|
+
beforeBuild?: {
|
|
23
|
+
properties?: Record<string, FieldDef>;
|
|
24
|
+
};
|
|
25
|
+
onload?: {
|
|
26
|
+
actions?: OnloadActions;
|
|
27
|
+
};
|
|
28
|
+
onLoads?: {
|
|
29
|
+
onload?: {
|
|
30
|
+
actions?: OnloadActions;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
interface OnloadActions {
|
|
36
|
+
presetValue?: Record<string, unknown>;
|
|
37
|
+
hide?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
interface FieldDef {
|
|
40
|
+
inputType?: string;
|
|
41
|
+
label?: string;
|
|
42
|
+
multiple?: boolean;
|
|
43
|
+
select2?: {
|
|
44
|
+
multiple?: boolean;
|
|
45
|
+
};
|
|
46
|
+
maximumSelectionLength?: number | string;
|
|
47
|
+
rules?: {
|
|
48
|
+
number?: unknown;
|
|
49
|
+
};
|
|
50
|
+
list?: string;
|
|
51
|
+
tagsList?: string;
|
|
52
|
+
savePath?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Digère `getcostumjson` → `CostumRuntimeContext` pour UNE collection (null si le costum ne couvre pas
|
|
56
|
+
* cette collection). `meta` = identité de l'élément porteur (costumId/costumType, résolue par slug/getinfo).
|
|
57
|
+
*/
|
|
58
|
+
/** Contexte digéré + capacités de création (add/createLabel) + clé `typeObj` (sous-type) du node. */
|
|
59
|
+
export type DigestedCostum = CostumRuntimeContext & {
|
|
60
|
+
add: boolean;
|
|
61
|
+
createLabel: string | null;
|
|
62
|
+
typeKey: string;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Énumère les FORMULAIRES d'un costum (une entrée par clé `typeObj` portant un `dynFormCostum`) — permet à
|
|
66
|
+
* l'assistant de générer un CostumFormSchema PAR SOUS-TYPE (ex. poi → `recoveryCenter` ET `article`), là où
|
|
67
|
+
* `digestCostumJson(collection)` n'en renvoie qu'un. `discriminator` = valeur de `presetValue.type` (le type
|
|
68
|
+
* estampillé au save qui distingue le sous-type), sinon la clé elle-même.
|
|
69
|
+
*/
|
|
70
|
+
export declare function listCostumFormNodes(data: CostumJsonData): Array<{
|
|
71
|
+
typeKey: string;
|
|
72
|
+
collection: string;
|
|
73
|
+
add: boolean;
|
|
74
|
+
createLabel: string | null;
|
|
75
|
+
discriminator?: string;
|
|
76
|
+
}>;
|
|
77
|
+
export declare function digestCostumJson(data: CostumJsonData, collection: Collection, meta: {
|
|
78
|
+
costumId: string;
|
|
79
|
+
costumType: string;
|
|
80
|
+
slug?: string;
|
|
81
|
+
baseFieldNames?: string[];
|
|
82
|
+
}, opts?: {
|
|
83
|
+
typeKey?: string;
|
|
84
|
+
}): DigestedCostum | null;
|
|
85
|
+
export {};
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
import type { Collection, CostumCollectionExt } from "./types.js";
|
|
2
|
-
|
|
1
|
+
import type { Collection, CostumCollectionExt, CostumExtensionField } from "./types.js";
|
|
2
|
+
/** Variante runtime SYNC (subtype-aware) : sélectionnée par `discriminator` (= serverData.type). */
|
|
3
|
+
export interface CostumRuntimeVariant {
|
|
4
|
+
discriminator: string | null;
|
|
5
|
+
schema: object;
|
|
6
|
+
fields: CostumExtensionField[];
|
|
7
|
+
presets: Record<string, unknown>;
|
|
8
|
+
hidden: string[];
|
|
9
|
+
}
|
|
10
|
+
export type CostumRuntimeEntry = Pick<CostumCollectionExt, "schema" | "fields" | "presets" | "hidden"> & {
|
|
11
|
+
variants?: CostumRuntimeVariant[];
|
|
12
|
+
};
|
|
3
13
|
export declare const COSTUM_RUNTIME: Record<string, Partial<Record<Collection, CostumRuntimeEntry>>>;
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
import type { CostumExtensionModule, CostumExtensionField, KnownCostumSlug, Collection } from "./types.js";
|
|
2
2
|
import type { BaseEntity } from "../api/BaseEntity.js";
|
|
3
|
+
/**
|
|
4
|
+
* Invalide le cache costum live — d'UN slug (ex. après avoir modifié ce costum en base), ou de TOUT
|
|
5
|
+
* (`invalidateCostumCache()`). Le prochain accès refetchera `getcostumjson` (C2e). Sans effet sur le bundle.
|
|
6
|
+
*/
|
|
7
|
+
export declare function invalidateCostumCache(slug?: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Énumère TOUS les formulaires costum d'un slug (UN descripteur PAR SOUS-TYPE = clé `typeObj`) via
|
|
10
|
+
* getcostumjson — pour l'assistant config (génération multi-form + routage `editModalMatch`). Distinct de
|
|
11
|
+
* `CostumScope.describeForm(collection)` qui n'en renvoie qu'UN par collection. Seuls les sous-types dont la
|
|
12
|
+
* collection de base est gérée par les fabriques (poi/organizations/projects/events) sont retournés.
|
|
13
|
+
*/
|
|
14
|
+
export declare function describeCostumForms(user: BaseEntity, slug: string): Promise<CostumFormDescriptor[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Pré-charge EN BATCH les costums (par slug) manquants/périmés du cache live, AVANT un revive synchrone
|
|
17
|
+
* (finalizer de `searchCostum`, `get()`, `entitySlug`). Dédup + TTL : un slug déjà frais est ignoré.
|
|
18
|
+
* Chaque fetch qui échoue est avalé (offline → le revive retombera sur le bundle). Concurrence bornée.
|
|
19
|
+
*/
|
|
20
|
+
export declare function prefetchCostums(user: BaseEntity, sourceKeys: (string | null | undefined)[]): Promise<void>;
|
|
3
21
|
/**
|
|
4
22
|
* Contexte costum résolu, attaché à une instance d'entité via `config.costumCtx`.
|
|
5
23
|
* Porté tel quel par `BaseEntity._costumCtx` et consommé par les 3 couches de filtrage.
|
|
@@ -56,6 +74,10 @@ export interface CostumFormDescriptor {
|
|
|
56
74
|
* Le consommateur les exclut du formulaire (les champs costum portent aussi `hidden` par champ). */
|
|
57
75
|
hidden: string[];
|
|
58
76
|
fields: CostumFieldDescriptor[];
|
|
77
|
+
/** Clé `typeObj` (sous-type) d'où vient ce form — présent quand issu de `describeCostumForms` (énumération). */
|
|
78
|
+
typeKey?: string;
|
|
79
|
+
/** Valeur de `type` estampillée au save qui distingue le sous-type (= presetValue.type, sinon typeKey). */
|
|
80
|
+
discriminator?: string;
|
|
59
81
|
}
|
|
60
82
|
/**
|
|
61
83
|
* Scope costum : fabrique des entités liées à un costum. Réutilise le `user` (parent, deps, auth)
|
|
@@ -68,8 +90,12 @@ export declare class CostumScope {
|
|
|
68
90
|
private readonly costumId;
|
|
69
91
|
private readonly costumType;
|
|
70
92
|
constructor(user: BaseEntity, slug: KnownCostumSlug | (string & {}), module: CostumExtensionModule, costumId: string, costumType: string);
|
|
71
|
-
/**
|
|
72
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Construit le `CostumRuntimeContext` pour une collection (null si non couverte). `type` (optionnel) = le
|
|
95
|
+
* sous-type voulu (= `presetValue.type` de la variante) : sélectionne l'overlay de CE sous-type, sinon la
|
|
96
|
+
* racine=union. Indispensable au CREATE d'un sous-type précis (bon `type`/presets/champs — cf. P0 write-safety).
|
|
97
|
+
*/
|
|
98
|
+
contextFor(collection: Collection, type?: string | null): CostumRuntimeContext | null;
|
|
73
99
|
/** Crée une entité de `collection` sous ce costum (presets appliqués, surchargeables par `data`). */
|
|
74
100
|
private create;
|
|
75
101
|
poi(data?: Record<string, unknown>): Promise<import("../index.js").Poi>;
|
|
@@ -85,20 +111,28 @@ export declare class CostumScope {
|
|
|
85
111
|
describeForm(collection: Collection): CostumFormDescriptor | null;
|
|
86
112
|
}
|
|
87
113
|
/**
|
|
88
|
-
* Dérive un `CostumRuntimeContext` SYNCHRONE depuis le `source.key` d'un élément CHARGÉ + sa collection
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
114
|
+
* Dérive un `CostumRuntimeContext` SYNCHRONE depuis le `source.key` d'un élément CHARGÉ + sa collection.
|
|
115
|
+
* Permet aux entités revifiées (`fromServerData` des résultats `searchCostum`, `me.poi({id})`) de retrouver
|
|
116
|
+
* leurs champs costum (writable + dispatch) sans `me.costum(slug)`.
|
|
117
|
+
*
|
|
118
|
+
* **LIVE-FIRST** (RFC fil C / cadrage C2) : le cache live FRAIS prime (un costum modifié en base est reflété
|
|
119
|
+
* sans republier), sinon la map bundlée `COSTUM_RUNTIME` (warm-start / offline), sinon ctx nu / null. Le
|
|
120
|
+
* cache est peuplé par `prefetchCostums` (async, AVANT le revive) ou `me.costum`/`loadCostumScope`.
|
|
93
121
|
*/
|
|
94
|
-
export declare function resolveCostumCtxFromSource(sourceKey: string | undefined | null, collection: Collection): CostumRuntimeContext | null;
|
|
122
|
+
export declare function resolveCostumCtxFromSource(sourceKey: string | undefined | null, collection: Collection, type?: string | null): CostumRuntimeContext | null;
|
|
95
123
|
/**
|
|
96
|
-
* Ouvre un scope costum
|
|
97
|
-
* l'entité (= `source.key` posé par le backend), `costumId/costumType` = l'entité porteuse.
|
|
98
|
-
*
|
|
99
|
-
*
|
|
124
|
+
* Ouvre un scope costum depuis une entité DÉJÀ CHARGÉE (org/projet/event porteur d'un costum) : `costumSlug`
|
|
125
|
+
* = slug de l'entité (= `source.key` posé par le backend), `costumId/costumType` = l'entité porteuse. C'est
|
|
126
|
+
* la voie AMBIANTE (« costum du déploiement ») de `me.costum(entity)`.
|
|
127
|
+
*
|
|
128
|
+
* Le scope porte les DÉFINITIONS du costum (champs + presets de sous-type, ex. `type:"article"`), PAS
|
|
129
|
+
* seulement l'identité : sinon un CREATE de sous-type sous l'ambiant perd le `type` forcé → rejet enum ADD_*.
|
|
130
|
+
* Résolution (dégradée, jamais throw) : 1) cache live frais (zéro fetch — le costum est déjà chargé au rendu
|
|
131
|
+
* du site) ; 2) digest live `getcostumjson` (comble presets/champs + peuple le cache) ; 3) fieldless
|
|
132
|
+
* (identité seule — site nu sans costum, ou offline = comportement historique). Le backend re-gate `found`
|
|
133
|
+
* sur l'existence d'un costum → un site sans costum n'estampille rien.
|
|
100
134
|
*/
|
|
101
|
-
export declare function costumScopeFromEntity(user: BaseEntity, entity: BaseEntity): CostumScope
|
|
135
|
+
export declare function costumScopeFromEntity(user: BaseEntity, entity: BaseEntity): Promise<CostumScope>;
|
|
102
136
|
/**
|
|
103
137
|
* Résout un `CostumScope` par SLUG pour un user connecté.
|
|
104
138
|
* - slug à champs (meta + loader) → charge le module généré (code-split via dynamic import).
|
|
@@ -106,3 +140,10 @@ export declare function costumScopeFromEntity(user: BaseEntity, entity: BaseEnti
|
|
|
106
140
|
* - slug HORS registry → résolution LIVE via `slug/getinfo` (contextId/contextType) → scope nu (tier 3b).
|
|
107
141
|
*/
|
|
108
142
|
export declare function resolveCostumScope(user: BaseEntity, slug: KnownCostumSlug | (string & {})): Promise<CostumScope>;
|
|
143
|
+
/**
|
|
144
|
+
* Charge EN LIVE le scope costum d'un slug hors registre (getcostumjson) et pose le `CostumRuntimeContext`
|
|
145
|
+
* de la collection donnée sur l'entité — pour ÉDITER un élément d'un costum non bundlé avec ses champs
|
|
146
|
+
* (comble l'édition vide L4). Idempotent : ne refetch pas si le cache live couvre déjà (slug, collection).
|
|
147
|
+
* No-op si le costum ne résout pas / ne couvre pas la collection (l'entité reste en scope d'identité).
|
|
148
|
+
*/
|
|
149
|
+
export declare function loadCostumContext(user: BaseEntity, slug: string, collection: Collection): Promise<CostumRuntimeContext | null>;
|
package/types/costum/types.d.ts
CHANGED
|
@@ -11,6 +11,17 @@ export interface CostumExtensionField {
|
|
|
11
11
|
enum?: string[];
|
|
12
12
|
multiple?: boolean;
|
|
13
13
|
}
|
|
14
|
+
/** Sous-type (subtype-aware) d'une collection : overlay create/édition résolu par `discriminator` (= presetValue.type). */
|
|
15
|
+
export interface CostumCollectionVariant {
|
|
16
|
+
typeKey: string;
|
|
17
|
+
discriminator: string | null;
|
|
18
|
+
add: boolean;
|
|
19
|
+
createLabel: string | null;
|
|
20
|
+
presets: Record<string, unknown>;
|
|
21
|
+
hidden: string[];
|
|
22
|
+
schema: object;
|
|
23
|
+
fields: CostumExtensionField[];
|
|
24
|
+
}
|
|
14
25
|
export interface CostumCollectionExt {
|
|
15
26
|
schema: object;
|
|
16
27
|
fields: CostumExtensionField[];
|
|
@@ -18,6 +29,8 @@ export interface CostumCollectionExt {
|
|
|
18
29
|
hidden: string[];
|
|
19
30
|
add: boolean;
|
|
20
31
|
createLabel: string | null;
|
|
32
|
+
/** Sous-types : émis SSI >1 form/collection. La racine (schema/fields) reste l'UNION pour la LECTURE. */
|
|
33
|
+
variants?: CostumCollectionVariant[];
|
|
21
34
|
}
|
|
22
35
|
export interface CostumExtensionModule {
|
|
23
36
|
slug: string;
|