Skip to content
This repository was archived by the owner on Mar 24, 2023. It is now read-only.

Commit bebf32f

Browse files
Merge pull request #648 from 10Dimensional/master
Create new resource via UI + version bump
2 parents 42d14fe + e112b53 commit bebf32f

File tree

4 files changed

+97
-4
lines changed

4 files changed

+97
-4
lines changed

web/init/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@replicatedhq/ship-init",
3-
"version": "1.4.0",
3+
"version": "1.4.1",
44
"description": "Shared component that contains the Ship Init app",
55
"author": "Replicated, Inc.",
66
"license": "Apache-2.0",

web/init/src/components/kustomize/kustomize_overlay/FileTree.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default class FileTree extends React.Component {
1414
render() {
1515
const { files, basePath, isRoot, selectedFile, handleFileSelect, handleDeleteOverlay, isOverlayTree, isResourceTree } = this.props;
1616
return (
17-
<ul className={`${isRoot ? "FileTree-wrapper" : "u-marginLeft--normal"}`}>
17+
<ul className={`${isRoot ? "FileTree-wrapper" : "u-marginLeft--normal"} u-position--relative`}>
1818
{files && files.map((file, i) => ( file.children && file.children.length ?
1919
<li key={`${file.path}-Directory-${i}`} className={`u-position--relative u-userSelect--none ${file.hasOverlay && "edited"}`}>
2020
<input type="checkbox" name={`sub-dir-${file.name}-${file.children.length}-${file.path}-${basePath}-${i}`} id={`sub-dir-${file.name}-${file.children.length}-${file.path}-${basePath}-${i}`} defaultChecked={true} />

web/init/src/components/kustomize/kustomize_overlay/KustomizeOverlay.jsx

+67-2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ export default class KustomizeOverlay extends React.Component {
3535
savingFinalize: false,
3636
displayConfirmModal: false,
3737
overlayToDelete: "",
38+
addingNewResource: false,
39+
newResourceName: ""
3840
};
41+
this.addResourceWrapper = React.createRef();
42+
this.addResourceInput = React.createRef();
3943
}
4044

4145
toggleModal = (overlayPath) => {
@@ -108,6 +112,7 @@ export default class KustomizeOverlay extends React.Component {
108112
}
109113

110114
setSelectedFile = async (path) => {
115+
console.log(path);
111116
this.setState({ selectedFile: path });
112117
await this.props.getFileContent(path).then(() => {
113118
// set state with new file content
@@ -173,11 +178,31 @@ export default class KustomizeOverlay extends React.Component {
173178
await this.props.saveKustomizeOverlay(payload).catch();
174179
await this.props.getCurrentStep();
175180
if (finalize) {
176-
this.setState({ savingFinalize: true });
181+
this.setState({ savingFinalize: true, addingNewResource: false });
177182
this.handleFinalize();
178183
}
179184
}
180185

186+
handleCreateResource = async () => {
187+
const { newResourceName } = this.state;
188+
const contents = "---"
189+
this.setState({ patch: contents });
190+
191+
const payload = {
192+
path: `/${newResourceName}`,
193+
contents,
194+
isResource: true
195+
};
196+
197+
await this.props.saveKustomizeOverlay(payload)
198+
.then(() => {
199+
this.setSelectedFile(`/${newResourceName}`);
200+
this.setState({ addingNewResource: false, newResourceName: "" })
201+
})
202+
.catch();
203+
await this.props.getCurrentStep();
204+
}
205+
181206
handleGeneratePatch = async (path) => {
182207
const current = this.aceEditorOverlay.editor.getValue();
183208
const { selectedFile, fileTreeBasePath } = this.state;
@@ -223,6 +248,27 @@ export default class KustomizeOverlay extends React.Component {
223248
}
224249
}, 500);
225250

251+
handleAddResourceClick = async () => {
252+
// Ref input won't focus until state has been set
253+
await this.setState({ addingNewResource: true });
254+
this.addResourceInput.current.focus();
255+
window.addEventListener("click", this.handleClickOutsideResourceInput);
256+
}
257+
258+
handleClickOutsideResourceInput = (e) => {
259+
const { addingNewResource } = this.state;
260+
if (addingNewResource && !this.addResourceWrapper.current.contains(e.target)) {
261+
this.setState({ addingNewResource: false, newResourceName: "" });
262+
window.removeEventListener("click", this.handleClickOutsideResourceInput);
263+
}
264+
}
265+
266+
handleCreateNewResource = (e) => {
267+
if(e.charCode === 13) {
268+
this.handleCreateResource()
269+
}
270+
}
271+
226272
render() {
227273
const { dataLoading } = this.props;
228274
const {
@@ -233,6 +279,8 @@ export default class KustomizeOverlay extends React.Component {
233279
patch,
234280
savingFinalize,
235281
fileContents,
282+
addingNewResource,
283+
newResourceName
236284
} = this.state;
237285
const fileToView = defaultTo(find(fileContents, ["key", selectedFile]), {});
238286
const showOverlay = patch.length;
@@ -260,6 +308,23 @@ export default class KustomizeOverlay extends React.Component {
260308
/>
261309
</div>
262310
))}
311+
<div className="add-new-resource u-position--relative" ref={this.addResourceWrapper}>
312+
<input
313+
type="text"
314+
className={`Input u-position--absolute ${!addingNewResource ? "u-visibility--hidden" : ""}`}
315+
name="new-resource"
316+
placeholder="filename.yaml"
317+
onChange={(e) => { this.setState({ newResourceName: e.target.value }) }}
318+
onKeyPress={(e) => { this.handleCreateNewResource(e) }}
319+
value={newResourceName}
320+
ref={this.addResourceInput}
321+
/>
322+
<p
323+
className={`add-resource-link u-position--absolute u-marginTop--small u-marginLeft--normal u-cursor--pointer u-fontSize--small u-color--silverSand u-fontWeight--bold ${addingNewResource ? "u-visibility--hidden" : ""}`}
324+
onClick={this.handleAddResourceClick}
325+
>+ Add Resource
326+
</p>
327+
</div>
263328
</div>
264329
</div>
265330
</div>
@@ -309,7 +374,7 @@ export default class KustomizeOverlay extends React.Component {
309374

310375
<div className={`flex-column flex1 overlays-editor-wrapper ${showOverlay ? "visible" : ""}`}>
311376
<div className="u-paddingLeft--20 u-paddingRight--20 u-paddingTop--20">
312-
<p className="u-marginBottom--normal u-fontSize--large u-color--tuna u-fontWeight--bold">Patch</p>
377+
<p className="u-marginBottom--normal u-fontSize--large u-color--tuna u-fontWeight--bold">{showBase ? "Patch" : "Resource"}</p>
313378
<p className="u-fontSize--small u-lineHeight--more u-fontWeight--medium u-color--doveGray">This YAML will be applied as a patch to the base YAML. Edit the values that you want patched. The current file you're editing will be automatically saved when you open a new file.</p>
314379
</div>
315380
<div className="flex1 flex-column file-contents-wrapper u-position--relative">

web/init/src/scss/components/kustomize/KustomizeOverlay.scss

+28
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,34 @@
174174
}
175175
}
176176

177+
.add-new-resource {
178+
top: -10px;
179+
.Input {
180+
margin: 0 0 0 30px;
181+
height: 20px;
182+
font-size: 12px;
183+
line-height: 2em;
184+
background: #193B5B;
185+
border: 0;
186+
color: #fff;
187+
width: 100%;
188+
border: solid 1px;
189+
border-radius: 2px;
190+
border-color: rgba(255, 255, 255, 0.2);
191+
&::placeholder {
192+
color: rgba(255, 255, 255, 0.7);
193+
}
194+
}
195+
}
196+
197+
.add-resource-link {
198+
padding-left: 20px;
199+
color: white;
200+
&.hidden {
201+
visibility: hidden;
202+
}
203+
}
204+
177205

178206
/* ≥ 768px */
179207
@media screen and (min-width: 48em) {

0 commit comments

Comments
 (0)