tinacms 0.0.0-df15737-20250329200825 → 0.0.0-df15996-20250420014759
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 +1 -1
- package/dist/auth/authenticate.d.ts +1 -1
- package/dist/client.js +10 -1
- package/dist/client.mjs +10 -1
- package/dist/index.js +411 -398
- package/dist/index.mjs +412 -399
- package/dist/internalClient/authProvider.d.ts +2 -0
- package/dist/internalClient/index.d.ts +3 -3
- package/dist/toolkit/components/media/media-manager.d.ts +1 -1
- package/dist/toolkit/plugin-branch-switcher/branch-switcher-legacy.d.ts +1 -1
- package/dist/toolkit/plugin-branch-switcher/branch-switcher.d.ts +1 -1
- package/dist/toolkit/react-cloud-config/cloud-config-plugin.d.ts +3 -3
- package/dist/unifiedClient/index.d.ts +1 -1
- package/package.json +5 -5
package/dist/index.mjs
CHANGED
|
@@ -54,12 +54,12 @@ import { ELEMENT_PARAGRAPH as ELEMENT_PARAGRAPH$1 } from "@udecode/plate-paragra
|
|
|
54
54
|
import { ELEMENT_BLOCKQUOTE as ELEMENT_BLOCKQUOTE$1 } from "@udecode/plate-block-quote";
|
|
55
55
|
import { useFloatingToolbarState, offset, flip, useFloatingToolbar } from "@udecode/plate-floating";
|
|
56
56
|
import { getIntrospectionQuery, buildClientSchema, print, parse as parse$3, buildSchema } from "graphql";
|
|
57
|
-
import gql from "graphql-tag";
|
|
58
57
|
import { TinaSchema, addNamespaceToSchema, parseURL, resolveForm, normalizePath, validateSchema } from "@tinacms/schema-tools";
|
|
59
58
|
import { NAMER, resolveField } from "@tinacms/schema-tools";
|
|
59
|
+
import gql from "graphql-tag";
|
|
60
60
|
import { diff } from "@graphql-inspector/core";
|
|
61
61
|
import * as yup from "yup";
|
|
62
|
-
import { NavLink,
|
|
62
|
+
import { NavLink, useLocation, useNavigate, useParams, Link, useSearchParams, HashRouter, Routes, Route } from "react-router-dom";
|
|
63
63
|
import { stringifyMDX } from "@tinacms/mdx";
|
|
64
64
|
const ModalProvider = ({ children }) => {
|
|
65
65
|
const [modalRootContainerRef, setModalRootContainerRef] = useState(
|
|
@@ -4430,36 +4430,6 @@ function MdOutlineArrowBackIos(props) {
|
|
|
4430
4430
|
function MdOutlinePerson(props) {
|
|
4431
4431
|
return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "fill": "none", "d": "M0 0h24v24H0V0z" }, "child": [] }, { "tag": "path", "attr": { "d": "M12 6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2m0 10c2.7 0 5.8 1.29 6 2H6c.23-.72 3.31-2 6-2m0-12C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 10c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" }, "child": [] }] })(props);
|
|
4432
4432
|
}
|
|
4433
|
-
const BranchContext = React.createContext({
|
|
4434
|
-
currentBranch: null,
|
|
4435
|
-
setCurrentBranch: (branch) => {
|
|
4436
|
-
console.warn("BranchContext not initialized");
|
|
4437
|
-
}
|
|
4438
|
-
});
|
|
4439
|
-
const BranchDataProvider = ({
|
|
4440
|
-
currentBranch,
|
|
4441
|
-
setCurrentBranch,
|
|
4442
|
-
children
|
|
4443
|
-
}) => {
|
|
4444
|
-
return /* @__PURE__ */ React.createElement(
|
|
4445
|
-
BranchContext.Provider,
|
|
4446
|
-
{
|
|
4447
|
-
value: {
|
|
4448
|
-
currentBranch,
|
|
4449
|
-
setCurrentBranch
|
|
4450
|
-
}
|
|
4451
|
-
},
|
|
4452
|
-
children
|
|
4453
|
-
);
|
|
4454
|
-
};
|
|
4455
|
-
const useBranchData = () => {
|
|
4456
|
-
const branchData = React.useContext(BranchContext);
|
|
4457
|
-
const { dispatch } = useEvent("branch:change");
|
|
4458
|
-
React.useEffect(() => {
|
|
4459
|
-
dispatch({ branchName: branchData.currentBranch });
|
|
4460
|
-
}, [branchData.currentBranch]);
|
|
4461
|
-
return branchData;
|
|
4462
|
-
};
|
|
4463
4433
|
const textFieldClasses = "shadow-inner focus:shadow-outline focus:border-blue-500 focus:outline-none block text-base placeholder:text-gray-300 px-3 py-2 text-gray-600 w-full bg-white border border-gray-200 transition-all ease-out duration-150 focus:text-gray-900 rounded-md";
|
|
4464
4434
|
const disabledClasses$1 = "opacity-50 pointer-events-none cursor-not-allowed";
|
|
4465
4435
|
const BaseTextField = React.forwardRef(({ className, disabled, ...rest }, ref) => {
|
|
@@ -8063,9 +8033,6 @@ const PasswordFieldPlugin = {
|
|
|
8063
8033
|
},
|
|
8064
8034
|
parse: parse$2
|
|
8065
8035
|
};
|
|
8066
|
-
function GrCircleQuestion(props) {
|
|
8067
|
-
return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "fill": "none", "strokeWidth": "2", "d": "M12,22 C17.5228475,22 22,17.5228475 22,12 C22,6.4771525 17.5228475,2 12,2 C6.4771525,2 2,6.4771525 2,12 C2,17.5228475 6.4771525,22 12,22 Z M12,15 L12,14 C12,13 12,12.5 13,12 C14,11.5 15,11 15,9.5 C15,8.5 14,7 12,7 C10,7 9,8.26413718 9,10 M12,16 L12,18" }, "child": [] }] })(props);
|
|
8068
|
-
}
|
|
8069
8036
|
function AiFillWarning(props) {
|
|
8070
8037
|
return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 1024 1024" }, "child": [{ "tag": "path", "attr": { "d": "M955.7 856l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zM480 416c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v184c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V416zm32 352a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z" }, "child": [] }] })(props);
|
|
8071
8038
|
}
|
|
@@ -8084,6 +8051,39 @@ function FaSpinner(props) {
|
|
|
8084
8051
|
function FaUnlock(props) {
|
|
8085
8052
|
return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 448 512" }, "child": [{ "tag": "path", "attr": { "d": "M400 256H152V152.9c0-39.6 31.7-72.5 71.3-72.9 40-.4 72.7 32.1 72.7 72v16c0 13.3 10.7 24 24 24h32c13.3 0 24-10.7 24-24v-16C376 68 307.5-.3 223.5 0 139.5.3 72 69.5 72 153.5V256H48c-26.5 0-48 21.5-48 48v160c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z" }, "child": [] }] })(props);
|
|
8086
8053
|
}
|
|
8054
|
+
function GrCircleQuestion(props) {
|
|
8055
|
+
return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "fill": "none", "strokeWidth": "2", "d": "M12,22 C17.5228475,22 22,17.5228475 22,12 C22,6.4771525 17.5228475,2 12,2 C6.4771525,2 2,6.4771525 2,12 C2,17.5228475 6.4771525,22 12,22 Z M12,15 L12,14 C12,13 12,12.5 13,12 C14,11.5 15,11 15,9.5 C15,8.5 14,7 12,7 C10,7 9,8.26413718 9,10 M12,16 L12,18" }, "child": [] }] })(props);
|
|
8056
|
+
}
|
|
8057
|
+
const BranchContext = React.createContext({
|
|
8058
|
+
currentBranch: null,
|
|
8059
|
+
setCurrentBranch: (branch) => {
|
|
8060
|
+
console.warn("BranchContext not initialized");
|
|
8061
|
+
}
|
|
8062
|
+
});
|
|
8063
|
+
const BranchDataProvider = ({
|
|
8064
|
+
currentBranch,
|
|
8065
|
+
setCurrentBranch,
|
|
8066
|
+
children
|
|
8067
|
+
}) => {
|
|
8068
|
+
return /* @__PURE__ */ React.createElement(
|
|
8069
|
+
BranchContext.Provider,
|
|
8070
|
+
{
|
|
8071
|
+
value: {
|
|
8072
|
+
currentBranch,
|
|
8073
|
+
setCurrentBranch
|
|
8074
|
+
}
|
|
8075
|
+
},
|
|
8076
|
+
children
|
|
8077
|
+
);
|
|
8078
|
+
};
|
|
8079
|
+
const useBranchData = () => {
|
|
8080
|
+
const branchData = React.useContext(BranchContext);
|
|
8081
|
+
const { dispatch } = useEvent("branch:change");
|
|
8082
|
+
React.useEffect(() => {
|
|
8083
|
+
dispatch({ branchName: branchData.currentBranch });
|
|
8084
|
+
}, [branchData.currentBranch]);
|
|
8085
|
+
return branchData;
|
|
8086
|
+
};
|
|
8087
8087
|
function formatBranchName$1(str) {
|
|
8088
8088
|
const pattern = /[^/\w-]+/g;
|
|
8089
8089
|
const formattedStr = str.replace(pattern, "");
|
|
@@ -8182,7 +8182,7 @@ const BranchSwitcherLegacy = ({
|
|
|
8182
8182
|
className: "transition-all duration-150 ease-out text-blue-600 hover:text-blue-400 hover:underline no-underline",
|
|
8183
8183
|
href: "https://tina.io/docs/tina-cloud/"
|
|
8184
8184
|
},
|
|
8185
|
-
"Learn more about moving to production with
|
|
8185
|
+
"Learn more about moving to production with TinaCloud."
|
|
8186
8186
|
)), /* @__PURE__ */ React.createElement("p", null, /* @__PURE__ */ React.createElement(
|
|
8187
8187
|
Button$1,
|
|
8188
8188
|
{
|
|
@@ -8418,7 +8418,7 @@ const EditoralBranchSwitcher = ({
|
|
|
8418
8418
|
className: "transition-all duration-150 ease-out text-blue-600 hover:text-blue-400 hover:underline no-underline",
|
|
8419
8419
|
href: "https://tina.io/docs/tina-cloud/"
|
|
8420
8420
|
},
|
|
8421
|
-
"Learn more about moving to production with
|
|
8421
|
+
"Learn more about moving to production with TinaCloud."
|
|
8422
8422
|
)), /* @__PURE__ */ React.createElement("p", null, /* @__PURE__ */ React.createElement(
|
|
8423
8423
|
Button$1,
|
|
8424
8424
|
{
|
|
@@ -9450,7 +9450,7 @@ const E_BAD_ROUTE = new MediaListError({
|
|
|
9450
9450
|
});
|
|
9451
9451
|
new MediaListError({
|
|
9452
9452
|
title: "An Error Occurred",
|
|
9453
|
-
message: "Something went wrong accessing your media from
|
|
9453
|
+
message: "Something went wrong accessing your media from TinaCloud.",
|
|
9454
9454
|
docsLink: ""
|
|
9455
9455
|
// TODO
|
|
9456
9456
|
});
|
|
@@ -9980,7 +9980,7 @@ const SyncStatus = ({ cms, setEventsOpen }) => {
|
|
|
9980
9980
|
"Event Log"
|
|
9981
9981
|
));
|
|
9982
9982
|
};
|
|
9983
|
-
const version = "2.7.
|
|
9983
|
+
const version = "2.7.5";
|
|
9984
9984
|
const Nav = ({
|
|
9985
9985
|
isLocalMode,
|
|
9986
9986
|
className = "",
|
|
@@ -11043,6 +11043,93 @@ function createPlaceholder(name, _pr) {
|
|
|
11043
11043
|
);
|
|
11044
11044
|
};
|
|
11045
11045
|
}
|
|
11046
|
+
function dirname(path) {
|
|
11047
|
+
var _a, _b;
|
|
11048
|
+
const pattern = new RegExp("(?<prevDir>.*)/");
|
|
11049
|
+
return (_b = (_a = path.match(pattern)) == null ? void 0 : _a.groups) == null ? void 0 : _b.prevDir;
|
|
11050
|
+
}
|
|
11051
|
+
const BreadcrumbButton = ({ className = "", ...props }) => /* @__PURE__ */ React__default.createElement(
|
|
11052
|
+
"button",
|
|
11053
|
+
{
|
|
11054
|
+
className: "capitalize transition-colors duration-150 border-0 bg-transparent hover:text-blue-500 " + className,
|
|
11055
|
+
...props
|
|
11056
|
+
}
|
|
11057
|
+
);
|
|
11058
|
+
function Breadcrumb$1({ directory = "", setDirectory }) {
|
|
11059
|
+
directory = directory.replace(/^\/|\/$/g, "");
|
|
11060
|
+
let prevDir = dirname(directory) || "";
|
|
11061
|
+
if (prevDir === ".") {
|
|
11062
|
+
prevDir = "";
|
|
11063
|
+
}
|
|
11064
|
+
return /* @__PURE__ */ React__default.createElement("div", { className: "w-full flex items-center text-[16px] text-gray-300" }, directory !== "" && /* @__PURE__ */ React__default.createElement(
|
|
11065
|
+
IconButton,
|
|
11066
|
+
{
|
|
11067
|
+
variant: "ghost",
|
|
11068
|
+
className: "mr-2",
|
|
11069
|
+
onClick: () => setDirectory(prevDir)
|
|
11070
|
+
},
|
|
11071
|
+
/* @__PURE__ */ React__default.createElement(
|
|
11072
|
+
LeftArrowIcon,
|
|
11073
|
+
{
|
|
11074
|
+
className: `w-7 h-auto fill-gray-300 hover:fill-gray-900 transition duration-150 ease-out`
|
|
11075
|
+
}
|
|
11076
|
+
)
|
|
11077
|
+
), /* @__PURE__ */ React__default.createElement(
|
|
11078
|
+
BreadcrumbButton,
|
|
11079
|
+
{
|
|
11080
|
+
onClick: () => setDirectory(""),
|
|
11081
|
+
className: directory === "" ? "text-gray-500 font-bold" : "text-gray-300 font-medium after:pl-1.5 after:content-['/']"
|
|
11082
|
+
},
|
|
11083
|
+
"Media"
|
|
11084
|
+
), directory && directory.split("/").map((part, index, parts) => {
|
|
11085
|
+
const currentDir = parts.slice(0, index + 1).join("/");
|
|
11086
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
11087
|
+
BreadcrumbButton,
|
|
11088
|
+
{
|
|
11089
|
+
className: "pl-1.5 " + (index + 1 === parts.length ? "text-gray-500 font-bold" : "text-gray-300 font-medium after:pl-1.5 after:content-['/']"),
|
|
11090
|
+
key: currentDir,
|
|
11091
|
+
onClick: () => {
|
|
11092
|
+
setDirectory(currentDir);
|
|
11093
|
+
}
|
|
11094
|
+
},
|
|
11095
|
+
part
|
|
11096
|
+
);
|
|
11097
|
+
}));
|
|
11098
|
+
}
|
|
11099
|
+
const CopyField = ({ label, description, value }) => {
|
|
11100
|
+
const [copied, setCopied] = React__default.useState(false);
|
|
11101
|
+
const [fadeOut, setFadeOut] = React__default.useState(false);
|
|
11102
|
+
return /* @__PURE__ */ React__default.createElement("div", { className: "w-full" }, label && /* @__PURE__ */ React__default.createElement("label", { className: "w-full mb-1 block flex-1 text-sm font-bold leading-5 text-gray-700" }, label), /* @__PURE__ */ React__default.createElement(
|
|
11103
|
+
"span",
|
|
11104
|
+
{
|
|
11105
|
+
onClick: () => {
|
|
11106
|
+
if (copied === true)
|
|
11107
|
+
return;
|
|
11108
|
+
setCopied(true);
|
|
11109
|
+
setTimeout(() => {
|
|
11110
|
+
setFadeOut(true);
|
|
11111
|
+
}, 2500);
|
|
11112
|
+
setTimeout(() => {
|
|
11113
|
+
setCopied(false);
|
|
11114
|
+
setFadeOut(false);
|
|
11115
|
+
}, 3e3);
|
|
11116
|
+
navigator.clipboard.writeText(value);
|
|
11117
|
+
},
|
|
11118
|
+
className: `shadow-inner text-base leading-5 whitespace-normal break-all px-3 py-2 text-gray-600 w-full bg-gray-50 border border-gray-200 transition-all ease-out duration-150 rounded-md relative overflow-hidden appearance-none flex items-center w-full cursor-pointer hover:bg-white hover:text-blue-500 ${copied ? `pointer-events-none` : ``}`
|
|
11119
|
+
},
|
|
11120
|
+
/* @__PURE__ */ React__default.createElement(BiCopyAlt, { className: "relative text-blue-500 shrink-0 w-5 h-auto mr-1.5 -ml-0.5 z-20" }),
|
|
11121
|
+
" ",
|
|
11122
|
+
value,
|
|
11123
|
+
" ",
|
|
11124
|
+
copied && /* @__PURE__ */ React__default.createElement(
|
|
11125
|
+
"span",
|
|
11126
|
+
{
|
|
11127
|
+
className: `${fadeOut ? `opacity-0` : `opacity-100`} text-blue-500 transition-opacity duration-500 absolute right-0 w-full h-full px-3 py-2 bg-white bg-opacity-90 flex items-center justify-center text-center tracking-wide font-medium z-10`
|
|
11128
|
+
},
|
|
11129
|
+
/* @__PURE__ */ React__default.createElement("span", null, "Copied to clipboard!")
|
|
11130
|
+
)
|
|
11131
|
+
), description && /* @__PURE__ */ React__default.createElement("p", { className: "mt-2 text-sm text-gray-500" }, description));
|
|
11132
|
+
};
|
|
11046
11133
|
function ListMediaItem({ item, onClick, active }) {
|
|
11047
11134
|
let FileIcon = BiFile;
|
|
11048
11135
|
if (item.type === "dir") {
|
|
@@ -11118,59 +11205,6 @@ function GridMediaItem({ item, active, onClick }) {
|
|
|
11118
11205
|
)
|
|
11119
11206
|
);
|
|
11120
11207
|
}
|
|
11121
|
-
function dirname(path) {
|
|
11122
|
-
var _a, _b;
|
|
11123
|
-
const pattern = new RegExp("(?<prevDir>.*)/");
|
|
11124
|
-
return (_b = (_a = path.match(pattern)) == null ? void 0 : _a.groups) == null ? void 0 : _b.prevDir;
|
|
11125
|
-
}
|
|
11126
|
-
const BreadcrumbButton = ({ className = "", ...props }) => /* @__PURE__ */ React__default.createElement(
|
|
11127
|
-
"button",
|
|
11128
|
-
{
|
|
11129
|
-
className: "capitalize transition-colors duration-150 border-0 bg-transparent hover:text-blue-500 " + className,
|
|
11130
|
-
...props
|
|
11131
|
-
}
|
|
11132
|
-
);
|
|
11133
|
-
function Breadcrumb$1({ directory = "", setDirectory }) {
|
|
11134
|
-
directory = directory.replace(/^\/|\/$/g, "");
|
|
11135
|
-
let prevDir = dirname(directory) || "";
|
|
11136
|
-
if (prevDir === ".") {
|
|
11137
|
-
prevDir = "";
|
|
11138
|
-
}
|
|
11139
|
-
return /* @__PURE__ */ React__default.createElement("div", { className: "w-full flex items-center text-[16px] text-gray-300" }, directory !== "" && /* @__PURE__ */ React__default.createElement(
|
|
11140
|
-
IconButton,
|
|
11141
|
-
{
|
|
11142
|
-
variant: "ghost",
|
|
11143
|
-
className: "mr-2",
|
|
11144
|
-
onClick: () => setDirectory(prevDir)
|
|
11145
|
-
},
|
|
11146
|
-
/* @__PURE__ */ React__default.createElement(
|
|
11147
|
-
LeftArrowIcon,
|
|
11148
|
-
{
|
|
11149
|
-
className: `w-7 h-auto fill-gray-300 hover:fill-gray-900 transition duration-150 ease-out`
|
|
11150
|
-
}
|
|
11151
|
-
)
|
|
11152
|
-
), /* @__PURE__ */ React__default.createElement(
|
|
11153
|
-
BreadcrumbButton,
|
|
11154
|
-
{
|
|
11155
|
-
onClick: () => setDirectory(""),
|
|
11156
|
-
className: directory === "" ? "text-gray-500 font-bold" : "text-gray-300 font-medium after:pl-1.5 after:content-['/']"
|
|
11157
|
-
},
|
|
11158
|
-
"Media"
|
|
11159
|
-
), directory && directory.split("/").map((part, index, parts) => {
|
|
11160
|
-
const currentDir = parts.slice(0, index + 1).join("/");
|
|
11161
|
-
return /* @__PURE__ */ React__default.createElement(
|
|
11162
|
-
BreadcrumbButton,
|
|
11163
|
-
{
|
|
11164
|
-
className: "pl-1.5 " + (index + 1 === parts.length ? "text-gray-500 font-bold" : "text-gray-300 font-medium after:pl-1.5 after:content-['/']"),
|
|
11165
|
-
key: currentDir,
|
|
11166
|
-
onClick: () => {
|
|
11167
|
-
setDirectory(currentDir);
|
|
11168
|
-
}
|
|
11169
|
-
},
|
|
11170
|
-
part
|
|
11171
|
-
);
|
|
11172
|
-
}));
|
|
11173
|
-
}
|
|
11174
11208
|
const DeleteModal$1 = ({
|
|
11175
11209
|
close: close2,
|
|
11176
11210
|
deleteFunc,
|
|
@@ -11224,40 +11258,6 @@ const NewFolderModal = ({ onSubmit, close: close2 }) => {
|
|
|
11224
11258
|
"Create New Folder"
|
|
11225
11259
|
))));
|
|
11226
11260
|
};
|
|
11227
|
-
const CopyField = ({ label, description, value }) => {
|
|
11228
|
-
const [copied, setCopied] = React__default.useState(false);
|
|
11229
|
-
const [fadeOut, setFadeOut] = React__default.useState(false);
|
|
11230
|
-
return /* @__PURE__ */ React__default.createElement("div", { className: "w-full" }, label && /* @__PURE__ */ React__default.createElement("label", { className: "w-full mb-1 block flex-1 text-sm font-bold leading-5 text-gray-700" }, label), /* @__PURE__ */ React__default.createElement(
|
|
11231
|
-
"span",
|
|
11232
|
-
{
|
|
11233
|
-
onClick: () => {
|
|
11234
|
-
if (copied === true)
|
|
11235
|
-
return;
|
|
11236
|
-
setCopied(true);
|
|
11237
|
-
setTimeout(() => {
|
|
11238
|
-
setFadeOut(true);
|
|
11239
|
-
}, 2500);
|
|
11240
|
-
setTimeout(() => {
|
|
11241
|
-
setCopied(false);
|
|
11242
|
-
setFadeOut(false);
|
|
11243
|
-
}, 3e3);
|
|
11244
|
-
navigator.clipboard.writeText(value);
|
|
11245
|
-
},
|
|
11246
|
-
className: `shadow-inner text-base leading-5 whitespace-normal break-all px-3 py-2 text-gray-600 w-full bg-gray-50 border border-gray-200 transition-all ease-out duration-150 rounded-md relative overflow-hidden appearance-none flex items-center w-full cursor-pointer hover:bg-white hover:text-blue-500 ${copied ? `pointer-events-none` : ``}`
|
|
11247
|
-
},
|
|
11248
|
-
/* @__PURE__ */ React__default.createElement(BiCopyAlt, { className: "relative text-blue-500 shrink-0 w-5 h-auto mr-1.5 -ml-0.5 z-20" }),
|
|
11249
|
-
" ",
|
|
11250
|
-
value,
|
|
11251
|
-
" ",
|
|
11252
|
-
copied && /* @__PURE__ */ React__default.createElement(
|
|
11253
|
-
"span",
|
|
11254
|
-
{
|
|
11255
|
-
className: `${fadeOut ? `opacity-0` : `opacity-100`} text-blue-500 transition-opacity duration-500 absolute right-0 w-full h-full px-3 py-2 bg-white bg-opacity-90 flex items-center justify-center text-center tracking-wide font-medium z-10`
|
|
11256
|
-
},
|
|
11257
|
-
/* @__PURE__ */ React__default.createElement("span", null, "Copied to clipboard!")
|
|
11258
|
-
)
|
|
11259
|
-
), description && /* @__PURE__ */ React__default.createElement("p", { className: "mt-2 text-sm text-gray-500" }, description));
|
|
11260
|
-
};
|
|
11261
11261
|
const { useDropzone } = dropzone;
|
|
11262
11262
|
const join = function(...parts) {
|
|
11263
11263
|
const [first, last, slash] = [0, parts.length - 1, "/"];
|
|
@@ -11759,7 +11759,7 @@ const SyncStatusContainer = ({ children }) => {
|
|
|
11759
11759
|
target: "_blank",
|
|
11760
11760
|
href: `${cms.api.tina.appDashboardLink}/media`
|
|
11761
11761
|
},
|
|
11762
|
-
"Sync Your Media In
|
|
11762
|
+
"Sync Your Media In TinaCloud.",
|
|
11763
11763
|
/* @__PURE__ */ React__default.createElement(BiLinkExternal, { className: `w-5 h-auto flex-shrink-0` })
|
|
11764
11764
|
)
|
|
11765
11765
|
)))) : /* @__PURE__ */ React__default.createElement(SyncStatusContext.Provider, { value: { syncStatus } }, children);
|
|
@@ -30364,9 +30364,15 @@ function popupWindow(url, title, window2, w, h) {
|
|
|
30364
30364
|
}
|
|
30365
30365
|
const TINA_LOGIN_EVENT = "tinaCloudLogin";
|
|
30366
30366
|
const AUTH_TOKEN_KEY = "tinacms-auth";
|
|
30367
|
-
const authenticate = (clientId, frontendUrl) => {
|
|
30367
|
+
const authenticate = (clientId, frontendUrl, oauth2) => {
|
|
30368
30368
|
return new Promise((resolve) => {
|
|
30369
30369
|
const origin = `${window.location.protocol}//${window.location.host}`;
|
|
30370
|
+
if (oauth2) {
|
|
30371
|
+
const redirectUri = encodeURIComponent(`${origin}/admin/auth/callback`);
|
|
30372
|
+
const codeChallenge = "jksdfjdsklf";
|
|
30373
|
+
window.location.href = `${frontendUrl}/oauth-signin?redirect_uri=${redirectUri}&code_challenge=${codeChallenge}&client_id=${clientId}`;
|
|
30374
|
+
return;
|
|
30375
|
+
}
|
|
30370
30376
|
const authTab = popupWindow(
|
|
30371
30377
|
`${frontendUrl}/signin?clientId=${clientId}&origin=${origin}`,
|
|
30372
30378
|
"_blank",
|
|
@@ -30447,6 +30453,7 @@ class TinaCloudAuthProvider extends AbstractAuthProvider {
|
|
|
30447
30453
|
this.frontendUrl = frontendUrl;
|
|
30448
30454
|
this.clientId = clientId;
|
|
30449
30455
|
this.identityApiUrl = identityApiUrl;
|
|
30456
|
+
this.oauth2 = options.oauth2 || false;
|
|
30450
30457
|
switch (tokenStorage) {
|
|
30451
30458
|
case "LOCAL_STORAGE":
|
|
30452
30459
|
this.getToken = async function() {
|
|
@@ -30492,7 +30499,11 @@ class TinaCloudAuthProvider extends AbstractAuthProvider {
|
|
|
30492
30499
|
}
|
|
30493
30500
|
}
|
|
30494
30501
|
async authenticate() {
|
|
30495
|
-
const token = await authenticate(
|
|
30502
|
+
const token = await authenticate(
|
|
30503
|
+
this.clientId,
|
|
30504
|
+
this.frontendUrl,
|
|
30505
|
+
this.oauth2
|
|
30506
|
+
);
|
|
30496
30507
|
this.setToken(token);
|
|
30497
30508
|
return token;
|
|
30498
30509
|
}
|
|
@@ -30603,7 +30614,7 @@ const IndexStatusResponse = z.object({
|
|
|
30603
30614
|
});
|
|
30604
30615
|
class Client {
|
|
30605
30616
|
constructor({ tokenStorage = "MEMORY", ...options }) {
|
|
30606
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
|
|
30617
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w;
|
|
30607
30618
|
this.events = new EventBus();
|
|
30608
30619
|
this.protectedBranches = [];
|
|
30609
30620
|
this.usingEditorialWorkflow = false;
|
|
@@ -30684,7 +30695,8 @@ mutation addPendingDocumentMutation(
|
|
|
30684
30695
|
identityApiUrl: this.identityApiUrl,
|
|
30685
30696
|
getTokenFn: options.getTokenFn,
|
|
30686
30697
|
tokenStorage,
|
|
30687
|
-
frontendUrl: this.frontendUrl
|
|
30698
|
+
frontendUrl: this.frontendUrl,
|
|
30699
|
+
oauth2: (_w = (_v = options.schema) == null ? void 0 : _v.config) == null ? void 0 : _w.oauth2
|
|
30688
30700
|
});
|
|
30689
30701
|
}
|
|
30690
30702
|
get isLocalMode() {
|
|
@@ -30696,6 +30708,7 @@ mutation addPendingDocumentMutation(
|
|
|
30696
30708
|
setBranch(branchName) {
|
|
30697
30709
|
var _a, _b, _c, _d;
|
|
30698
30710
|
const encodedBranch = encodeURIComponent(branchName);
|
|
30711
|
+
document.cookie = `x-branch=${encodedBranch}; path=/; max-age=3600`;
|
|
30699
30712
|
this.branch = encodedBranch;
|
|
30700
30713
|
this.assetsApiUrl = ((_a = this.options.tinaioConfig) == null ? void 0 : _a.assetsApiUrlOverride) || "https://assets.tinajs.io";
|
|
30701
30714
|
this.frontendUrl = ((_b = this.options.tinaioConfig) == null ? void 0 : _b.frontendUrlOverride) || "https://app.tina.io";
|
|
@@ -30738,7 +30751,7 @@ mutation addPendingDocumentMutation(
|
|
|
30738
30751
|
branch: ${this.branch}.`;
|
|
30739
30752
|
if (this.branch !== "main") {
|
|
30740
30753
|
errorMessage = `${errorMessage}
|
|
30741
|
-
Note: This error can occur if the branch does not exist on GitHub or on
|
|
30754
|
+
Note: This error can occur if the branch does not exist on GitHub or on TinaCloud`;
|
|
30742
30755
|
}
|
|
30743
30756
|
}
|
|
30744
30757
|
throw new Error(errorMessage);
|
|
@@ -30874,7 +30887,7 @@ mutation addPendingDocumentMutation(
|
|
|
30874
30887
|
unknownCount++;
|
|
30875
30888
|
if (unknownCount > 5) {
|
|
30876
30889
|
throw new Error(
|
|
30877
|
-
"AsyncPoller: status unknown for too long, please check indexing progress the
|
|
30890
|
+
"AsyncPoller: status unknown for too long, please check indexing progress the TinaCloud dashboard"
|
|
30878
30891
|
);
|
|
30879
30892
|
}
|
|
30880
30893
|
}
|
|
@@ -31585,7 +31598,7 @@ const AuthWallInner = ({
|
|
|
31585
31598
|
});
|
|
31586
31599
|
}
|
|
31587
31600
|
};
|
|
31588
|
-
let modalTitle = "
|
|
31601
|
+
let modalTitle = "TinaCloud";
|
|
31589
31602
|
if (activeModal === "authenticate" && loginStrategy === "Redirect" && !isTinaCloud) {
|
|
31590
31603
|
modalTitle = "Enter into edit mode";
|
|
31591
31604
|
} else if (activeModal === "authenticate" && loginStrategy === "UsernamePassword") {
|
|
@@ -31601,7 +31614,7 @@ const AuthWallInner = ({
|
|
|
31601
31614
|
ModalBuilder,
|
|
31602
31615
|
{
|
|
31603
31616
|
title: modalTitle,
|
|
31604
|
-
message: isTinaCloud ? "Your site uses
|
|
31617
|
+
message: isTinaCloud ? "Your site uses TinaCloud to track changes. To make edits, you must log in." : "To save edits, enter into edit mode. On save, changes will saved to the local filesystem.",
|
|
31605
31618
|
close,
|
|
31606
31619
|
actions: [
|
|
31607
31620
|
...otherModalActions,
|
|
@@ -32324,6 +32337,14 @@ This will work when developing locally but NOT when deployed to production.
|
|
|
32324
32337
|
}
|
|
32325
32338
|
return client.request(query, { variables });
|
|
32326
32339
|
};
|
|
32340
|
+
const GetCMS = ({ children }) => {
|
|
32341
|
+
try {
|
|
32342
|
+
const cms = useCMS$1();
|
|
32343
|
+
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, children(cms));
|
|
32344
|
+
} catch (e) {
|
|
32345
|
+
return null;
|
|
32346
|
+
}
|
|
32347
|
+
};
|
|
32327
32348
|
const Layout = ({ children }) => {
|
|
32328
32349
|
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
|
|
32329
32350
|
"div",
|
|
@@ -32535,47 +32556,6 @@ const SidebarCloudLink = ({ config }) => {
|
|
|
32535
32556
|
}
|
|
32536
32557
|
return /* @__PURE__ */ React__default.createElement("span", { className: "text-base tracking-wide text-gray-500 hover:text-blue-600 flex items-center opacity-90 hover:opacity-100" }, /* @__PURE__ */ React__default.createElement(config.Icon, { className: "mr-2 h-6 opacity-80 w-auto" }), /* @__PURE__ */ React__default.createElement("a", { target: "_blank", href: config.link.href }, config.link.text));
|
|
32537
32558
|
};
|
|
32538
|
-
const GetCMS = ({ children }) => {
|
|
32539
|
-
try {
|
|
32540
|
-
const cms = useCMS$1();
|
|
32541
|
-
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, children(cms));
|
|
32542
|
-
} catch (e) {
|
|
32543
|
-
return null;
|
|
32544
|
-
}
|
|
32545
|
-
};
|
|
32546
|
-
const PageWrapper = ({ children }) => {
|
|
32547
|
-
var _a, _b;
|
|
32548
|
-
const cms = useCMS$1();
|
|
32549
|
-
const isLocalMode = (_b = (_a = cms.api) == null ? void 0 : _a.tina) == null ? void 0 : _b.isLocalMode;
|
|
32550
|
-
const [branchingEnabled, setBranchingEnabled] = React__default.useState(
|
|
32551
|
-
() => cms.flags.get("branch-switcher")
|
|
32552
|
-
);
|
|
32553
|
-
React__default.useEffect(() => {
|
|
32554
|
-
cms.events.subscribe("flag:set", ({ key, value }) => {
|
|
32555
|
-
if (key === "branch-switcher") {
|
|
32556
|
-
setBranchingEnabled(value);
|
|
32557
|
-
}
|
|
32558
|
-
});
|
|
32559
|
-
}, [cms.events]);
|
|
32560
|
-
return /* @__PURE__ */ React__default.createElement("div", { className: "relative left-0 w-full h-full bg-gradient-to-b from-gray-50/50 to-gray-50 shadow-2xl overflow-y-auto transition-opacity duration-300 ease-out flex flex-col opacity-100" }, branchingEnabled && !isLocalMode && /* @__PURE__ */ React__default.createElement(BranchBanner, null), children);
|
|
32561
|
-
};
|
|
32562
|
-
const PageHeader = ({
|
|
32563
|
-
isLocalMode,
|
|
32564
|
-
children
|
|
32565
|
-
}) => {
|
|
32566
|
-
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, isLocalMode && /* @__PURE__ */ React__default.createElement(LocalWarning, null), !isLocalMode && /* @__PURE__ */ React__default.createElement(BillingWarning, null), /* @__PURE__ */ React__default.createElement("div", { className: "pt-16 xl:pt-12 px-6 xl:px-12" }, /* @__PURE__ */ React__default.createElement("div", { className: "w-full mx-auto max-w-screen-xl" }, /* @__PURE__ */ React__default.createElement("div", { className: "w-full flex justify-between items-end" }, children))));
|
|
32567
|
-
};
|
|
32568
|
-
const PageBody = ({ children }) => /* @__PURE__ */ React__default.createElement("div", { className: "py-8 px-6 xl:px-12" }, children);
|
|
32569
|
-
const PageBodyNarrow = ({ children }) => /* @__PURE__ */ React__default.createElement("div", { className: "py-10 px-6 xl:px-12" }, /* @__PURE__ */ React__default.createElement("div", { className: "w-full mx-auto max-w-screen-xl" }, children));
|
|
32570
|
-
const DashboardPage = () => {
|
|
32571
|
-
return /* @__PURE__ */ React__default.createElement(GetCMS, null, (cms) => {
|
|
32572
|
-
var _a, _b;
|
|
32573
|
-
return /* @__PURE__ */ React__default.createElement(PageWrapper, null, /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(PageHeader, { isLocalMode: (_b = (_a = cms.api) == null ? void 0 : _a.tina) == null ? void 0 : _b.isLocalMode }, /* @__PURE__ */ React__default.createElement("h3", { className: "text-2xl font-sans text-gray-700" }, "Welcome to Tina!")), /* @__PURE__ */ React__default.createElement(PageBodyNarrow, null, "This is your dashboard for editing or creating content. Select a collection on the left to begin.")));
|
|
32574
|
-
});
|
|
32575
|
-
};
|
|
32576
|
-
function RiHome2Line(props) {
|
|
32577
|
-
return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24", "fill": "currentColor" }, "child": [{ "tag": "path", "attr": { "d": "M19 21H5C4.44772 21 4 20.5523 4 20V11L1 11L11.3273 1.6115C11.7087 1.26475 12.2913 1.26475 12.6727 1.6115L23 11L20 11V20C20 20.5523 19.5523 21 19 21ZM6 19H18V9.15745L12 3.7029L6 9.15745V19Z" }, "child": [] }] })(props);
|
|
32578
|
-
}
|
|
32579
32559
|
const LoadingPage = () => /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(
|
|
32580
32560
|
"div",
|
|
32581
32561
|
{
|
|
@@ -32685,231 +32665,33 @@ const LoadingPage = () => /* @__PURE__ */ React__default.createElement(React__de
|
|
|
32685
32665
|
)
|
|
32686
32666
|
)
|
|
32687
32667
|
));
|
|
32688
|
-
|
|
32689
|
-
|
|
32690
|
-
|
|
32691
|
-
}) => {
|
|
32692
|
-
|
|
32693
|
-
|
|
32694
|
-
const
|
|
32695
|
-
|
|
32696
|
-
|
|
32697
|
-
|
|
32698
|
-
|
|
32699
|
-
|
|
32700
|
-
|
|
32701
|
-
|
|
32702
|
-
for (const field of template.fields) {
|
|
32703
|
-
if (collectionMap[field.name]) {
|
|
32704
|
-
if (collectionMap[field.name].type !== field.type) {
|
|
32705
|
-
conflictedFields.add(field.name);
|
|
32706
|
-
}
|
|
32707
|
-
} else {
|
|
32708
|
-
collectionMap[field.name] = field;
|
|
32709
|
-
}
|
|
32710
|
-
}
|
|
32711
|
-
}
|
|
32712
|
-
for (const key in conflictedFields) {
|
|
32713
|
-
delete collectionMap[key];
|
|
32714
|
-
}
|
|
32715
|
-
for (const key in collectionMap) {
|
|
32716
|
-
if (key === sortKey) {
|
|
32717
|
-
return true;
|
|
32718
|
-
}
|
|
32719
|
-
}
|
|
32720
|
-
return false;
|
|
32721
|
-
}
|
|
32722
|
-
};
|
|
32723
|
-
const useGetCollection = (cms, collectionName, includeDocuments = true, folder, after = "", sortKey, filterArgs) => {
|
|
32724
|
-
const api = new TinaAdminApi(cms);
|
|
32725
|
-
const schema = cms.api.tina.schema;
|
|
32726
|
-
const collectionExtra = schema.getCollection(collectionName);
|
|
32727
|
-
const [collection, setCollection] = useState(void 0);
|
|
32728
|
-
const [loading, setLoading] = useState(true);
|
|
32729
|
-
const [error, setError] = useState(void 0);
|
|
32730
|
-
const [resetState, setResetSate] = useState(0);
|
|
32731
|
-
useEffect(() => {
|
|
32732
|
-
let cancelled = false;
|
|
32733
|
-
const fetchCollection = async () => {
|
|
32734
|
-
if (await api.isAuthenticated() && !folder.loading && !cancelled) {
|
|
32735
|
-
const { name, order } = JSON.parse(sortKey || "{}");
|
|
32736
|
-
const validSortKey = isValidSortKey(name, collectionExtra) ? name : void 0;
|
|
32737
|
-
try {
|
|
32738
|
-
const collection2 = await api.fetchCollection(
|
|
32739
|
-
collectionName,
|
|
32740
|
-
includeDocuments,
|
|
32741
|
-
(filterArgs == null ? void 0 : filterArgs.filterField) ? "" : folder.fullyQualifiedName,
|
|
32742
|
-
after,
|
|
32743
|
-
validSortKey,
|
|
32744
|
-
order,
|
|
32745
|
-
filterArgs
|
|
32746
|
-
);
|
|
32747
|
-
setCollection(collection2);
|
|
32748
|
-
} catch (error2) {
|
|
32749
|
-
cms.alerts.error(
|
|
32750
|
-
`[${error2.name}] GetCollection failed: ${error2.message}`
|
|
32751
|
-
);
|
|
32752
|
-
console.error(error2);
|
|
32753
|
-
setCollection(void 0);
|
|
32754
|
-
setError(error2);
|
|
32755
|
-
}
|
|
32756
|
-
setLoading(false);
|
|
32757
|
-
}
|
|
32758
|
-
};
|
|
32759
|
-
if (cancelled)
|
|
32760
|
-
return;
|
|
32761
|
-
setLoading(true);
|
|
32762
|
-
fetchCollection();
|
|
32763
|
-
return () => {
|
|
32764
|
-
cancelled = true;
|
|
32765
|
-
};
|
|
32766
|
-
}, [
|
|
32767
|
-
cms,
|
|
32768
|
-
collectionName,
|
|
32769
|
-
folder.loading,
|
|
32770
|
-
folder.fullyQualifiedName,
|
|
32771
|
-
resetState,
|
|
32772
|
-
after,
|
|
32773
|
-
sortKey
|
|
32774
|
-
]);
|
|
32775
|
-
const reFetchCollection = () => setResetSate((x) => x + 1);
|
|
32776
|
-
return { collection, loading, error, reFetchCollection, collectionExtra };
|
|
32777
|
-
};
|
|
32778
|
-
const useSearchCollection = (cms, collectionName, includeDocuments = true, folder, after = "", search) => {
|
|
32779
|
-
const api = new TinaAdminApi(cms);
|
|
32780
|
-
const schema = cms.api.tina.schema;
|
|
32781
|
-
const collectionExtra = schema.getCollection(collectionName);
|
|
32782
|
-
const [collection, setCollection] = useState(void 0);
|
|
32783
|
-
const [loading, setLoading] = useState(true);
|
|
32784
|
-
const [error, setError] = useState(void 0);
|
|
32785
|
-
const [resetState, setResetSate] = useState(0);
|
|
32786
|
-
useEffect(() => {
|
|
32787
|
-
let cancelled = false;
|
|
32788
|
-
const searchCollection = async () => {
|
|
32789
|
-
if (await api.isAuthenticated() && !folder.loading && !cancelled) {
|
|
32790
|
-
try {
|
|
32791
|
-
const response = await cms.api.search.query(
|
|
32792
|
-
`${search} AND _collection:${collectionName}`,
|
|
32793
|
-
{
|
|
32794
|
-
limit: 15,
|
|
32795
|
-
cursor: after
|
|
32796
|
-
}
|
|
32797
|
-
);
|
|
32798
|
-
const docs = await Promise.allSettled(
|
|
32799
|
-
response.results.map((result) => {
|
|
32800
|
-
const [collection2, relativePath2] = result._id.split(":");
|
|
32801
|
-
return api.fetchDocument(collection2, relativePath2, false);
|
|
32802
|
-
})
|
|
32803
|
-
);
|
|
32804
|
-
const edges = docs.filter((p) => {
|
|
32805
|
-
var _a;
|
|
32806
|
-
return p.status === "fulfilled" && !!((_a = p.value) == null ? void 0 : _a.document);
|
|
32807
|
-
}).map((result) => ({ node: result.value.document }));
|
|
32808
|
-
const c = await api.fetchCollection(collectionName, false, "");
|
|
32809
|
-
setCollection({
|
|
32810
|
-
format: collection.format,
|
|
32811
|
-
label: collection.label,
|
|
32812
|
-
name: collectionName,
|
|
32813
|
-
templates: collection.templates,
|
|
32814
|
-
documents: {
|
|
32815
|
-
pageInfo: {
|
|
32816
|
-
hasNextPage: !!response.nextCursor,
|
|
32817
|
-
hasPreviousPage: !!response.prevCursor,
|
|
32818
|
-
startCursor: "",
|
|
32819
|
-
endCursor: response.nextCursor || ""
|
|
32820
|
-
},
|
|
32821
|
-
edges
|
|
32822
|
-
}
|
|
32823
|
-
});
|
|
32824
|
-
} catch (error2) {
|
|
32825
|
-
cms.alerts.error(
|
|
32826
|
-
`[${error2.name}] GetCollection failed: ${error2.message}`
|
|
32827
|
-
);
|
|
32828
|
-
console.error(error2);
|
|
32829
|
-
setCollection(void 0);
|
|
32830
|
-
setError(error2);
|
|
32831
|
-
}
|
|
32832
|
-
setLoading(false);
|
|
32668
|
+
function RiHome2Line(props) {
|
|
32669
|
+
return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24", "fill": "currentColor" }, "child": [{ "tag": "path", "attr": { "d": "M19 21H5C4.44772 21 4 20.5523 4 20V11L1 11L11.3273 1.6115C11.7087 1.26475 12.2913 1.26475 12.6727 1.6115L23 11L20 11V20C20 20.5523 19.5523 21 19 21ZM6 19H18V9.15745L12 3.7029L6 9.15745V19Z" }, "child": [] }] })(props);
|
|
32670
|
+
}
|
|
32671
|
+
const PageWrapper = ({ children }) => {
|
|
32672
|
+
var _a, _b;
|
|
32673
|
+
const cms = useCMS$1();
|
|
32674
|
+
const isLocalMode = (_b = (_a = cms.api) == null ? void 0 : _a.tina) == null ? void 0 : _b.isLocalMode;
|
|
32675
|
+
const [branchingEnabled, setBranchingEnabled] = React__default.useState(
|
|
32676
|
+
() => cms.flags.get("branch-switcher")
|
|
32677
|
+
);
|
|
32678
|
+
React__default.useEffect(() => {
|
|
32679
|
+
cms.events.subscribe("flag:set", ({ key, value }) => {
|
|
32680
|
+
if (key === "branch-switcher") {
|
|
32681
|
+
setBranchingEnabled(value);
|
|
32833
32682
|
}
|
|
32834
|
-
};
|
|
32835
|
-
|
|
32836
|
-
|
|
32837
|
-
setLoading(true);
|
|
32838
|
-
searchCollection();
|
|
32839
|
-
return () => {
|
|
32840
|
-
cancelled = true;
|
|
32841
|
-
};
|
|
32842
|
-
}, [
|
|
32843
|
-
cms,
|
|
32844
|
-
collectionName,
|
|
32845
|
-
folder.loading,
|
|
32846
|
-
folder.fullyQualifiedName,
|
|
32847
|
-
resetState,
|
|
32848
|
-
after,
|
|
32849
|
-
search
|
|
32850
|
-
]);
|
|
32851
|
-
const reFetchCollection = () => setResetSate((x) => x + 1);
|
|
32852
|
-
return { collection, loading, error, reFetchCollection, collectionExtra };
|
|
32683
|
+
});
|
|
32684
|
+
}, [cms.events]);
|
|
32685
|
+
return /* @__PURE__ */ React__default.createElement("div", { className: "relative left-0 w-full h-full bg-gradient-to-b from-gray-50/50 to-gray-50 shadow-2xl overflow-y-auto transition-opacity duration-300 ease-out flex flex-col opacity-100" }, branchingEnabled && !isLocalMode && /* @__PURE__ */ React__default.createElement(BranchBanner, null), children);
|
|
32853
32686
|
};
|
|
32854
|
-
const
|
|
32855
|
-
|
|
32856
|
-
|
|
32857
|
-
folder,
|
|
32858
|
-
includeDocuments = true,
|
|
32859
|
-
startCursor,
|
|
32860
|
-
sortKey,
|
|
32861
|
-
children,
|
|
32862
|
-
filterArgs,
|
|
32863
|
-
search
|
|
32687
|
+
const PageHeader = ({
|
|
32688
|
+
isLocalMode,
|
|
32689
|
+
children
|
|
32864
32690
|
}) => {
|
|
32865
|
-
|
|
32866
|
-
const { collection, loading, error, reFetchCollection, collectionExtra } = search ? useSearchCollection(
|
|
32867
|
-
cms,
|
|
32868
|
-
collectionName,
|
|
32869
|
-
includeDocuments,
|
|
32870
|
-
folder,
|
|
32871
|
-
startCursor || "",
|
|
32872
|
-
search
|
|
32873
|
-
) : useGetCollection(
|
|
32874
|
-
cms,
|
|
32875
|
-
collectionName,
|
|
32876
|
-
includeDocuments,
|
|
32877
|
-
folder,
|
|
32878
|
-
startCursor || "",
|
|
32879
|
-
sortKey,
|
|
32880
|
-
filterArgs
|
|
32881
|
-
) || {};
|
|
32882
|
-
useEffect(() => {
|
|
32883
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
32884
|
-
if (loading)
|
|
32885
|
-
return;
|
|
32886
|
-
const collectionDefinition = cms.api.tina.schema.getCollection(
|
|
32887
|
-
collection.name
|
|
32888
|
-
);
|
|
32889
|
-
const allowCreate = ((_b = (_a = collectionDefinition == null ? void 0 : collectionDefinition.ui) == null ? void 0 : _a.allowedActions) == null ? void 0 : _b.create) ?? true;
|
|
32890
|
-
const allowDelete = ((_d = (_c = collectionDefinition == null ? void 0 : collectionDefinition.ui) == null ? void 0 : _c.allowedActions) == null ? void 0 : _d.delete) ?? true;
|
|
32891
|
-
const collectionResponse = collection;
|
|
32892
|
-
if (!allowCreate && !allowDelete && // Check there is only one document
|
|
32893
|
-
((_f = (_e = collectionResponse.documents) == null ? void 0 : _e.edges) == null ? void 0 : _f.length) === 1 && // Check to make sure the file is not a folder
|
|
32894
|
-
((_i = (_h = (_g = collectionResponse.documents) == null ? void 0 : _g.edges[0]) == null ? void 0 : _h.node) == null ? void 0 : _i.__typename) !== "Folder") {
|
|
32895
|
-
const doc = collectionResponse.documents.edges[0].node;
|
|
32896
|
-
handleNavigate(
|
|
32897
|
-
navigate,
|
|
32898
|
-
cms,
|
|
32899
|
-
collectionResponse,
|
|
32900
|
-
collectionDefinition,
|
|
32901
|
-
doc
|
|
32902
|
-
);
|
|
32903
|
-
}
|
|
32904
|
-
}, [(collection == null ? void 0 : collection.name) || "", loading]);
|
|
32905
|
-
if (error) {
|
|
32906
|
-
return /* @__PURE__ */ React__default.createElement(FullscreenError, null);
|
|
32907
|
-
}
|
|
32908
|
-
if (loading) {
|
|
32909
|
-
return /* @__PURE__ */ React__default.createElement(LoadingPage, null);
|
|
32910
|
-
}
|
|
32911
|
-
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, children(collection, loading, reFetchCollection, collectionExtra));
|
|
32691
|
+
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, isLocalMode && /* @__PURE__ */ React__default.createElement(LocalWarning, null), !isLocalMode && /* @__PURE__ */ React__default.createElement(BillingWarning, null), /* @__PURE__ */ React__default.createElement("div", { className: "pt-16 xl:pt-12 px-6 xl:px-12" }, /* @__PURE__ */ React__default.createElement("div", { className: "w-full mx-auto max-w-screen-xl" }, /* @__PURE__ */ React__default.createElement("div", { className: "w-full flex justify-between items-end" }, children))));
|
|
32912
32692
|
};
|
|
32693
|
+
const PageBody = ({ children }) => /* @__PURE__ */ React__default.createElement("div", { className: "py-8 px-6 xl:px-12" }, children);
|
|
32694
|
+
const PageBodyNarrow = ({ children }) => /* @__PURE__ */ React__default.createElement("div", { className: "py-10 px-6 xl:px-12" }, /* @__PURE__ */ React__default.createElement("div", { className: "w-full mx-auto max-w-screen-xl" }, children));
|
|
32913
32695
|
const folderRegex = /^.*\/~\/*(.*)$/;
|
|
32914
32696
|
const parentFolder = (folder) => {
|
|
32915
32697
|
return {
|
|
@@ -33787,6 +33569,231 @@ const RenameModal = ({
|
|
|
33787
33569
|
"Rename"
|
|
33788
33570
|
))));
|
|
33789
33571
|
};
|
|
33572
|
+
const FullscreenError = ({
|
|
33573
|
+
title = "Error",
|
|
33574
|
+
errorMessage = "It looks like something went wrong."
|
|
33575
|
+
}) => {
|
|
33576
|
+
return /* @__PURE__ */ React__default.createElement("div", { className: "flex flex-col justify-center items-center h-screen bg-gray-100" }, /* @__PURE__ */ React__default.createElement("div", { className: "text-red-500 text-4xl mb-6 flex items-center" }, /* @__PURE__ */ React__default.createElement(BiError, { className: "w-12 h-auto fill-current text-red-400 opacity-70 mr-1" }), " ", title), /* @__PURE__ */ React__default.createElement("p", { className: "text-gray-700 text-xl mb-8" }, errorMessage), /* @__PURE__ */ React__default.createElement(Button$1, { variant: "danger", onClick: () => window.location.reload() }, /* @__PURE__ */ React__default.createElement(BiSync, { className: "w-7 h-auto fill-current opacity-70 mr-1" }), " Reload"));
|
|
33577
|
+
};
|
|
33578
|
+
const isValidSortKey = (sortKey, collection) => {
|
|
33579
|
+
if (collection.fields) {
|
|
33580
|
+
const sortKeys = collection.fields.map((x) => x.name);
|
|
33581
|
+
return sortKeys.includes(sortKey);
|
|
33582
|
+
} else if (collection.templates) {
|
|
33583
|
+
const collectionMap = {};
|
|
33584
|
+
const conflictedFields = /* @__PURE__ */ new Set();
|
|
33585
|
+
for (const template of collection.templates) {
|
|
33586
|
+
for (const field of template.fields) {
|
|
33587
|
+
if (collectionMap[field.name]) {
|
|
33588
|
+
if (collectionMap[field.name].type !== field.type) {
|
|
33589
|
+
conflictedFields.add(field.name);
|
|
33590
|
+
}
|
|
33591
|
+
} else {
|
|
33592
|
+
collectionMap[field.name] = field;
|
|
33593
|
+
}
|
|
33594
|
+
}
|
|
33595
|
+
}
|
|
33596
|
+
for (const key in conflictedFields) {
|
|
33597
|
+
delete collectionMap[key];
|
|
33598
|
+
}
|
|
33599
|
+
for (const key in collectionMap) {
|
|
33600
|
+
if (key === sortKey) {
|
|
33601
|
+
return true;
|
|
33602
|
+
}
|
|
33603
|
+
}
|
|
33604
|
+
return false;
|
|
33605
|
+
}
|
|
33606
|
+
};
|
|
33607
|
+
const useGetCollection = (cms, collectionName, includeDocuments = true, folder, after = "", sortKey, filterArgs) => {
|
|
33608
|
+
const api = new TinaAdminApi(cms);
|
|
33609
|
+
const schema = cms.api.tina.schema;
|
|
33610
|
+
const collectionExtra = schema.getCollection(collectionName);
|
|
33611
|
+
const [collection, setCollection] = useState(void 0);
|
|
33612
|
+
const [loading, setLoading] = useState(true);
|
|
33613
|
+
const [error, setError] = useState(void 0);
|
|
33614
|
+
const [resetState, setResetSate] = useState(0);
|
|
33615
|
+
useEffect(() => {
|
|
33616
|
+
let cancelled = false;
|
|
33617
|
+
const fetchCollection = async () => {
|
|
33618
|
+
if (await api.isAuthenticated() && !folder.loading && !cancelled) {
|
|
33619
|
+
const { name, order } = JSON.parse(sortKey || "{}");
|
|
33620
|
+
const validSortKey = isValidSortKey(name, collectionExtra) ? name : void 0;
|
|
33621
|
+
try {
|
|
33622
|
+
const collection2 = await api.fetchCollection(
|
|
33623
|
+
collectionName,
|
|
33624
|
+
includeDocuments,
|
|
33625
|
+
(filterArgs == null ? void 0 : filterArgs.filterField) ? "" : folder.fullyQualifiedName,
|
|
33626
|
+
after,
|
|
33627
|
+
validSortKey,
|
|
33628
|
+
order,
|
|
33629
|
+
filterArgs
|
|
33630
|
+
);
|
|
33631
|
+
setCollection(collection2);
|
|
33632
|
+
} catch (error2) {
|
|
33633
|
+
cms.alerts.error(
|
|
33634
|
+
`[${error2.name}] GetCollection failed: ${error2.message}`
|
|
33635
|
+
);
|
|
33636
|
+
console.error(error2);
|
|
33637
|
+
setCollection(void 0);
|
|
33638
|
+
setError(error2);
|
|
33639
|
+
}
|
|
33640
|
+
setLoading(false);
|
|
33641
|
+
}
|
|
33642
|
+
};
|
|
33643
|
+
if (cancelled)
|
|
33644
|
+
return;
|
|
33645
|
+
setLoading(true);
|
|
33646
|
+
fetchCollection();
|
|
33647
|
+
return () => {
|
|
33648
|
+
cancelled = true;
|
|
33649
|
+
};
|
|
33650
|
+
}, [
|
|
33651
|
+
cms,
|
|
33652
|
+
collectionName,
|
|
33653
|
+
folder.loading,
|
|
33654
|
+
folder.fullyQualifiedName,
|
|
33655
|
+
resetState,
|
|
33656
|
+
after,
|
|
33657
|
+
sortKey
|
|
33658
|
+
]);
|
|
33659
|
+
const reFetchCollection = () => setResetSate((x) => x + 1);
|
|
33660
|
+
return { collection, loading, error, reFetchCollection, collectionExtra };
|
|
33661
|
+
};
|
|
33662
|
+
const useSearchCollection = (cms, collectionName, includeDocuments = true, folder, after = "", search) => {
|
|
33663
|
+
const api = new TinaAdminApi(cms);
|
|
33664
|
+
const schema = cms.api.tina.schema;
|
|
33665
|
+
const collectionExtra = schema.getCollection(collectionName);
|
|
33666
|
+
const [collection, setCollection] = useState(void 0);
|
|
33667
|
+
const [loading, setLoading] = useState(true);
|
|
33668
|
+
const [error, setError] = useState(void 0);
|
|
33669
|
+
const [resetState, setResetSate] = useState(0);
|
|
33670
|
+
useEffect(() => {
|
|
33671
|
+
let cancelled = false;
|
|
33672
|
+
const searchCollection = async () => {
|
|
33673
|
+
if (await api.isAuthenticated() && !folder.loading && !cancelled) {
|
|
33674
|
+
try {
|
|
33675
|
+
const response = await cms.api.search.query(
|
|
33676
|
+
`${search} AND _collection:${collectionName}`,
|
|
33677
|
+
{
|
|
33678
|
+
limit: 15,
|
|
33679
|
+
cursor: after
|
|
33680
|
+
}
|
|
33681
|
+
);
|
|
33682
|
+
const docs = await Promise.allSettled(
|
|
33683
|
+
response.results.map((result) => {
|
|
33684
|
+
const [collection2, relativePath2] = result._id.split(":");
|
|
33685
|
+
return api.fetchDocument(collection2, relativePath2, false);
|
|
33686
|
+
})
|
|
33687
|
+
);
|
|
33688
|
+
const edges = docs.filter((p) => {
|
|
33689
|
+
var _a;
|
|
33690
|
+
return p.status === "fulfilled" && !!((_a = p.value) == null ? void 0 : _a.document);
|
|
33691
|
+
}).map((result) => ({ node: result.value.document }));
|
|
33692
|
+
const c = await api.fetchCollection(collectionName, false, "");
|
|
33693
|
+
setCollection({
|
|
33694
|
+
format: collection.format,
|
|
33695
|
+
label: collection.label,
|
|
33696
|
+
name: collectionName,
|
|
33697
|
+
templates: collection.templates,
|
|
33698
|
+
documents: {
|
|
33699
|
+
pageInfo: {
|
|
33700
|
+
hasNextPage: !!response.nextCursor,
|
|
33701
|
+
hasPreviousPage: !!response.prevCursor,
|
|
33702
|
+
startCursor: "",
|
|
33703
|
+
endCursor: response.nextCursor || ""
|
|
33704
|
+
},
|
|
33705
|
+
edges
|
|
33706
|
+
}
|
|
33707
|
+
});
|
|
33708
|
+
} catch (error2) {
|
|
33709
|
+
cms.alerts.error(
|
|
33710
|
+
`[${error2.name}] GetCollection failed: ${error2.message}`
|
|
33711
|
+
);
|
|
33712
|
+
console.error(error2);
|
|
33713
|
+
setCollection(void 0);
|
|
33714
|
+
setError(error2);
|
|
33715
|
+
}
|
|
33716
|
+
setLoading(false);
|
|
33717
|
+
}
|
|
33718
|
+
};
|
|
33719
|
+
if (cancelled)
|
|
33720
|
+
return;
|
|
33721
|
+
setLoading(true);
|
|
33722
|
+
searchCollection();
|
|
33723
|
+
return () => {
|
|
33724
|
+
cancelled = true;
|
|
33725
|
+
};
|
|
33726
|
+
}, [
|
|
33727
|
+
cms,
|
|
33728
|
+
collectionName,
|
|
33729
|
+
folder.loading,
|
|
33730
|
+
folder.fullyQualifiedName,
|
|
33731
|
+
resetState,
|
|
33732
|
+
after,
|
|
33733
|
+
search
|
|
33734
|
+
]);
|
|
33735
|
+
const reFetchCollection = () => setResetSate((x) => x + 1);
|
|
33736
|
+
return { collection, loading, error, reFetchCollection, collectionExtra };
|
|
33737
|
+
};
|
|
33738
|
+
const GetCollection = ({
|
|
33739
|
+
cms,
|
|
33740
|
+
collectionName,
|
|
33741
|
+
folder,
|
|
33742
|
+
includeDocuments = true,
|
|
33743
|
+
startCursor,
|
|
33744
|
+
sortKey,
|
|
33745
|
+
children,
|
|
33746
|
+
filterArgs,
|
|
33747
|
+
search
|
|
33748
|
+
}) => {
|
|
33749
|
+
const navigate = useNavigate();
|
|
33750
|
+
const { collection, loading, error, reFetchCollection, collectionExtra } = search ? useSearchCollection(
|
|
33751
|
+
cms,
|
|
33752
|
+
collectionName,
|
|
33753
|
+
includeDocuments,
|
|
33754
|
+
folder,
|
|
33755
|
+
startCursor || "",
|
|
33756
|
+
search
|
|
33757
|
+
) : useGetCollection(
|
|
33758
|
+
cms,
|
|
33759
|
+
collectionName,
|
|
33760
|
+
includeDocuments,
|
|
33761
|
+
folder,
|
|
33762
|
+
startCursor || "",
|
|
33763
|
+
sortKey,
|
|
33764
|
+
filterArgs
|
|
33765
|
+
) || {};
|
|
33766
|
+
useEffect(() => {
|
|
33767
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
33768
|
+
if (loading)
|
|
33769
|
+
return;
|
|
33770
|
+
const collectionDefinition = cms.api.tina.schema.getCollection(
|
|
33771
|
+
collection.name
|
|
33772
|
+
);
|
|
33773
|
+
const allowCreate = ((_b = (_a = collectionDefinition == null ? void 0 : collectionDefinition.ui) == null ? void 0 : _a.allowedActions) == null ? void 0 : _b.create) ?? true;
|
|
33774
|
+
const allowDelete = ((_d = (_c = collectionDefinition == null ? void 0 : collectionDefinition.ui) == null ? void 0 : _c.allowedActions) == null ? void 0 : _d.delete) ?? true;
|
|
33775
|
+
const collectionResponse = collection;
|
|
33776
|
+
if (!allowCreate && !allowDelete && // Check there is only one document
|
|
33777
|
+
((_f = (_e = collectionResponse.documents) == null ? void 0 : _e.edges) == null ? void 0 : _f.length) === 1 && // Check to make sure the file is not a folder
|
|
33778
|
+
((_i = (_h = (_g = collectionResponse.documents) == null ? void 0 : _g.edges[0]) == null ? void 0 : _h.node) == null ? void 0 : _i.__typename) !== "Folder") {
|
|
33779
|
+
const doc = collectionResponse.documents.edges[0].node;
|
|
33780
|
+
handleNavigate(
|
|
33781
|
+
navigate,
|
|
33782
|
+
cms,
|
|
33783
|
+
collectionResponse,
|
|
33784
|
+
collectionDefinition,
|
|
33785
|
+
doc
|
|
33786
|
+
);
|
|
33787
|
+
}
|
|
33788
|
+
}, [(collection == null ? void 0 : collection.name) || "", loading]);
|
|
33789
|
+
if (error) {
|
|
33790
|
+
return /* @__PURE__ */ React__default.createElement(FullscreenError, null);
|
|
33791
|
+
}
|
|
33792
|
+
if (loading) {
|
|
33793
|
+
return /* @__PURE__ */ React__default.createElement(LoadingPage, null);
|
|
33794
|
+
}
|
|
33795
|
+
return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, children(collection, loading, reFetchCollection, collectionExtra));
|
|
33796
|
+
};
|
|
33790
33797
|
const ErrorDialog = (props) => {
|
|
33791
33798
|
return /* @__PURE__ */ React__default.createElement(
|
|
33792
33799
|
"div",
|
|
@@ -34330,6 +34337,12 @@ const RenderForm = ({
|
|
|
34330
34337
|
), /* @__PURE__ */ React__default.createElement("span", { className: "opacity-30 text-sm leading-tight whitespace-nowrap flex-0" }, "/"), /* @__PURE__ */ React__default.createElement("span", { className: "flex-1 w-full text-sm leading-tight whitespace-nowrap truncate" }, `${filename}.${collection.format}`), /* @__PURE__ */ React__default.createElement(FormStatus, { pristine: formIsPristine }))
|
|
34331
34338
|
), activeForm && /* @__PURE__ */ React__default.createElement(FormBuilder, { form: activeForm, onPristineChange: setFormIsPristine }));
|
|
34332
34339
|
};
|
|
34340
|
+
const DashboardPage = () => {
|
|
34341
|
+
return /* @__PURE__ */ React__default.createElement(GetCMS, null, (cms) => {
|
|
34342
|
+
var _a, _b;
|
|
34343
|
+
return /* @__PURE__ */ React__default.createElement(PageWrapper, null, /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(PageHeader, { isLocalMode: (_b = (_a = cms.api) == null ? void 0 : _a.tina) == null ? void 0 : _b.isLocalMode }, /* @__PURE__ */ React__default.createElement("h3", { className: "text-2xl font-sans text-gray-700" }, "Welcome to Tina!")), /* @__PURE__ */ React__default.createElement(PageBodyNarrow, null, "This is your dashboard for editing or creating content. Select a collection on the left to begin.")));
|
|
34344
|
+
});
|
|
34345
|
+
};
|
|
34333
34346
|
const ScreenPage = () => {
|
|
34334
34347
|
const { screenName } = useParams();
|
|
34335
34348
|
return /* @__PURE__ */ React__default.createElement(GetCMS, null, (cms) => {
|
|
@@ -34412,7 +34425,7 @@ const IndexingPage = () => {
|
|
|
34412
34425
|
} catch {
|
|
34413
34426
|
cms.alerts.error("Branch indexing failed.");
|
|
34414
34427
|
setErrorMessage(
|
|
34415
|
-
'Branch indexing failed, please check the
|
|
34428
|
+
'Branch indexing failed, please check the TinaCloud dashboard for more information. To try again chick "re-index" on the branch in the dashboard.'
|
|
34416
34429
|
);
|
|
34417
34430
|
setState("error");
|
|
34418
34431
|
}
|
|
@@ -34580,7 +34593,7 @@ const CheckSchema = ({
|
|
|
34580
34593
|
);
|
|
34581
34594
|
}
|
|
34582
34595
|
}).catch((e) => {
|
|
34583
|
-
if (e.message.includes("has not been indexed by
|
|
34596
|
+
if (e.message.includes("has not been indexed by TinaCloud")) {
|
|
34584
34597
|
setSchemaMissingError(true);
|
|
34585
34598
|
} else {
|
|
34586
34599
|
cms.alerts.error(`Unexpected error checking schema: ${e}`);
|