diff --git a/thinks/static/thinks/think-editor.css b/thinks/static/thinks/think-editor.css index 05313da..7dd587a 100644 --- a/thinks/static/thinks/think-editor.css +++ b/thinks/static/thinks/think-editor.css @@ -109,8 +109,12 @@ input:not([type="hidden"]) ~ button { input { border: thin solid currentColor; + height: 100%; + background: var(--default-background); +} +input[type="file"] { + font-size: 0.66rem; } - .field { display: flex; @@ -239,6 +243,12 @@ input { z-index: 1; } + & #file-form { + & > :is(img,video) { + width: 100%; + } + } + & code-editor { background: var(--default-background); display: block; diff --git a/thinks/static/thinks/think-editor.js b/thinks/static/thinks/think-editor.js index ed83263..1de6cd4 100644 --- a/thinks/static/thinks/think-editor.js +++ b/thinks/static/thinks/think-editor.js @@ -5546,7 +5546,9 @@ var $author$project$App$Model = function (show_preview) { return function (file_content) { return function (is_dir) { return function (elm_packages) { - return {command_to_run: command_to_run, commit_message: commit_message, content_changed: content_changed, csrf_token: csrf_token, editor_size: editor_size, elm_packages: elm_packages, file_content: file_content, file_path: file_path, files: files, is_dir: is_dir, jj_status: jj_status, log: log, preview_url: preview_url, selected_package: selected_package, show_log: show_log, show_preview: show_preview, slug: slug}; + return function (mime_type) { + return {command_to_run: command_to_run, commit_message: commit_message, content_changed: content_changed, csrf_token: csrf_token, editor_size: editor_size, elm_packages: elm_packages, file_content: file_content, file_path: file_path, files: files, is_dir: is_dir, jj_status: jj_status, log: log, mime_type: mime_type, preview_url: preview_url, selected_package: selected_package, show_log: show_log, show_preview: show_preview, slug: slug}; + }; }; }; }; @@ -5564,6 +5566,10 @@ var $author$project$App$Model = function (show_preview) { }; }; }; +var $danyx23$elm_mimetype$MimeType$PlainText = {$: 'PlainText'}; +var $danyx23$elm_mimetype$MimeType$Text = function (a) { + return {$: 'Text', a: a}; +}; var $elm_community$json_extra$Json$Decode$Extra$andMap = $elm$json$Json$Decode$map2($elm$core$Basics$apR); var $elm$json$Json$Decode$bool = _Json_decodeBool; var $elm$core$Basics$composeR = F3( @@ -5597,8 +5603,201 @@ var $author$project$App$decode_file_info = A4( A2($elm$json$Json$Decode$field, 'name', $elm$json$Json$Decode$string), A2($elm$json$Json$Decode$field, 'is_dir', $elm$json$Json$Decode$bool), A2($elm$json$Json$Decode$field, 'path', $elm$json$Json$Decode$string)); +var $danyx23$elm_mimetype$MimeType$App = function (a) { + return {$: 'App', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$Audio = function (a) { + return {$: 'Audio', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$Avi = {$: 'Avi'}; +var $danyx23$elm_mimetype$MimeType$Css = {$: 'Css'}; +var $danyx23$elm_mimetype$MimeType$Excel = {$: 'Excel'}; +var $danyx23$elm_mimetype$MimeType$ExcelXml = {$: 'ExcelXml'}; +var $danyx23$elm_mimetype$MimeType$Gif = {$: 'Gif'}; +var $danyx23$elm_mimetype$MimeType$Html = {$: 'Html'}; +var $danyx23$elm_mimetype$MimeType$Image = function (a) { + return {$: 'Image', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$Jpeg = {$: 'Jpeg'}; +var $danyx23$elm_mimetype$MimeType$Json = {$: 'Json'}; +var $danyx23$elm_mimetype$MimeType$Mp3 = {$: 'Mp3'}; +var $danyx23$elm_mimetype$MimeType$Mp4 = {$: 'Mp4'}; +var $danyx23$elm_mimetype$MimeType$Mpeg = {$: 'Mpeg'}; +var $danyx23$elm_mimetype$MimeType$Ogg = {$: 'Ogg'}; +var $danyx23$elm_mimetype$MimeType$OtherAudio = function (a) { + return {$: 'OtherAudio', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$OtherImage = function (a) { + return {$: 'OtherImage', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$OtherMimeType = function (a) { + return {$: 'OtherMimeType', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$OtherText = function (a) { + return {$: 'OtherText', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$OtherVideo = function (a) { + return {$: 'OtherVideo', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$Pdf = {$: 'Pdf'}; +var $danyx23$elm_mimetype$MimeType$Png = {$: 'Png'}; +var $danyx23$elm_mimetype$MimeType$PowerPoint = {$: 'PowerPoint'}; +var $danyx23$elm_mimetype$MimeType$PowerPointXml = {$: 'PowerPointXml'}; +var $danyx23$elm_mimetype$MimeType$Quicktime = {$: 'Quicktime'}; +var $danyx23$elm_mimetype$MimeType$Video = function (a) { + return {$: 'Video', a: a}; +}; +var $danyx23$elm_mimetype$MimeType$Wav = {$: 'Wav'}; +var $danyx23$elm_mimetype$MimeType$Webm = {$: 'Webm'}; +var $danyx23$elm_mimetype$MimeType$Word = {$: 'Word'}; +var $danyx23$elm_mimetype$MimeType$WordXml = {$: 'WordXml'}; +var $danyx23$elm_mimetype$MimeType$Xml = {$: 'Xml'}; +var $elm$core$String$toLower = _String_toLower; +var $danyx23$elm_mimetype$MimeType$parseMimeType = function (mimeString) { + var _v0 = $elm$core$String$toLower(mimeString); + switch (_v0) { + case '': + return $elm$core$Maybe$Nothing; + case 'image/jpeg': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Image($danyx23$elm_mimetype$MimeType$Jpeg)); + case 'image/png': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Image($danyx23$elm_mimetype$MimeType$Png)); + case 'image/gif': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Image($danyx23$elm_mimetype$MimeType$Gif)); + case 'audio/mp3': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Audio($danyx23$elm_mimetype$MimeType$Mp3)); + case 'audio/mpeg': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Audio($danyx23$elm_mimetype$MimeType$Mp3)); + case 'audio/wav': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Audio($danyx23$elm_mimetype$MimeType$Wav)); + case 'audio/ogg': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Audio($danyx23$elm_mimetype$MimeType$Ogg)); + case 'video/mp4': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Video($danyx23$elm_mimetype$MimeType$Mp4)); + case 'video/mpeg': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Video($danyx23$elm_mimetype$MimeType$Mpeg)); + case 'video/quicktime': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Video($danyx23$elm_mimetype$MimeType$Quicktime)); + case 'video/avi': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Video($danyx23$elm_mimetype$MimeType$Avi)); + case 'video/webm': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Video($danyx23$elm_mimetype$MimeType$Webm)); + case 'text/plain': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Text($danyx23$elm_mimetype$MimeType$PlainText)); + case 'text/html': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Text($danyx23$elm_mimetype$MimeType$Html)); + case 'text/css': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Text($danyx23$elm_mimetype$MimeType$Css)); + case 'text/xml': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Text($danyx23$elm_mimetype$MimeType$Xml)); + case 'application/json': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Text($danyx23$elm_mimetype$MimeType$Json)); + case 'application/msword': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$App($danyx23$elm_mimetype$MimeType$Word)); + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$App($danyx23$elm_mimetype$MimeType$WordXml)); + case 'application/vnd.ms-excel': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$App($danyx23$elm_mimetype$MimeType$Excel)); + case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$App($danyx23$elm_mimetype$MimeType$ExcelXml)); + case 'application/vnd.ms-powerpoint': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$App($danyx23$elm_mimetype$MimeType$PowerPoint)); + case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$App($danyx23$elm_mimetype$MimeType$PowerPointXml)); + case 'application/pdf': + return $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$App($danyx23$elm_mimetype$MimeType$Pdf)); + default: + var lowerCaseMimeString = _v0; + return A2($elm$core$String$startsWith, 'image/', lowerCaseMimeString) ? $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Image( + $danyx23$elm_mimetype$MimeType$OtherImage( + A2( + $elm$core$String$dropLeft, + $elm$core$String$length('image/'), + lowerCaseMimeString)))) : (A2($elm$core$String$startsWith, 'audio/', lowerCaseMimeString) ? $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Audio( + $danyx23$elm_mimetype$MimeType$OtherAudio( + A2( + $elm$core$String$dropLeft, + $elm$core$String$length('audio/'), + lowerCaseMimeString)))) : (A2($elm$core$String$startsWith, 'video/', lowerCaseMimeString) ? $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Video( + $danyx23$elm_mimetype$MimeType$OtherVideo( + A2( + $elm$core$String$dropLeft, + $elm$core$String$length('video/'), + lowerCaseMimeString)))) : (A2($elm$core$String$startsWith, 'text/', lowerCaseMimeString) ? $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$Text( + $danyx23$elm_mimetype$MimeType$OtherText( + A2( + $elm$core$String$dropLeft, + $elm$core$String$length('text/'), + lowerCaseMimeString)))) : $elm$core$Maybe$Just( + $danyx23$elm_mimetype$MimeType$OtherMimeType(lowerCaseMimeString))))); + } +}; +var $elm$core$Maybe$withDefault = F2( + function (_default, maybe) { + if (maybe.$ === 'Just') { + var value = maybe.a; + return value; + } else { + return _default; + } + }); +var $author$project$App$decode_mime_type = A2( + $elm$json$Json$Decode$map, + A2( + $elm$core$Basics$composeR, + $danyx23$elm_mimetype$MimeType$parseMimeType, + $elm$core$Maybe$withDefault( + $danyx23$elm_mimetype$MimeType$Text($danyx23$elm_mimetype$MimeType$PlainText))), + $elm$json$Json$Decode$string); var $author$project$App$NotLoaded = {$: 'NotLoaded'}; -var $author$project$App$init_model = {command_to_run: '', commit_message: '', content_changed: false, csrf_token: '', editor_size: 0.5, elm_packages: _List_Nil, file_content: 'The editor has not loaded successfully.', file_path: 'Oops!', files: _List_Nil, is_dir: false, jj_status: '', log: $author$project$App$NotLoaded, preview_url: '', selected_package: '', show_log: false, show_preview: true, slug: 'not-a-real-thing'}; +var $author$project$App$init_model = { + command_to_run: '', + commit_message: '', + content_changed: false, + csrf_token: '', + editor_size: 0.5, + elm_packages: _List_Nil, + file_content: 'The editor has not loaded successfully.', + file_path: 'Oops!', + files: _List_Nil, + is_dir: false, + jj_status: '', + log: $author$project$App$NotLoaded, + mime_type: $danyx23$elm_mimetype$MimeType$Text($danyx23$elm_mimetype$MimeType$PlainText), + preview_url: '', + selected_package: '', + show_log: false, + show_preview: true, + slug: 'not-a-real-thing' +}; var $elm$json$Json$Decode$list = _Json_decodeList; var $elm$json$Json$Decode$oneOf = _Json_oneOf; var $elm$core$Result$withDefault = F2( @@ -5618,38 +5817,52 @@ var $author$project$App$load_flags = A2( $elm$json$Json$Decode$oneOf( _List_fromArray( [ - A2( - $elm$json$Json$Decode$field, - 'elm_packages', - $elm$json$Json$Decode$list($author$project$App$decode_elm_package)), - $elm$json$Json$Decode$succeed(_List_Nil) + A2($elm$json$Json$Decode$field, 'mime_type', $author$project$App$decode_mime_type), + $elm$json$Json$Decode$succeed( + $danyx23$elm_mimetype$MimeType$Text($danyx23$elm_mimetype$MimeType$PlainText)) ])), A2( $elm_community$json_extra$Json$Decode$Extra$andMap, - A2($elm$json$Json$Decode$field, 'is_dir', $elm$json$Json$Decode$bool), + $elm$json$Json$Decode$oneOf( + _List_fromArray( + [ + A2( + $elm$json$Json$Decode$field, + 'elm_packages', + $elm$json$Json$Decode$list($author$project$App$decode_elm_package)), + $elm$json$Json$Decode$succeed(_List_Nil) + ])), A2( $elm_community$json_extra$Json$Decode$Extra$andMap, - A2($elm$json$Json$Decode$field, 'file_content', $elm$json$Json$Decode$string), + A2($elm$json$Json$Decode$field, 'is_dir', $elm$json$Json$Decode$bool), A2( $elm_community$json_extra$Json$Decode$Extra$andMap, - A2($elm$json$Json$Decode$field, 'file_path', $elm$json$Json$Decode$string), + $elm$json$Json$Decode$oneOf( + _List_fromArray( + [ + A2($elm$json$Json$Decode$field, 'file_content', $elm$json$Json$Decode$string), + $elm$json$Json$Decode$succeed('') + ])), A2( $elm_community$json_extra$Json$Decode$Extra$andMap, - A2( - $elm$json$Json$Decode$field, - 'files', - $elm$json$Json$Decode$list($author$project$App$decode_file_info)), + A2($elm$json$Json$Decode$field, 'file_path', $elm$json$Json$Decode$string), A2( $elm_community$json_extra$Json$Decode$Extra$andMap, - A2($elm$json$Json$Decode$field, 'slug', $elm$json$Json$Decode$string), + A2( + $elm$json$Json$Decode$field, + 'files', + $elm$json$Json$Decode$list($author$project$App$decode_file_info)), A2( $elm_community$json_extra$Json$Decode$Extra$andMap, - A2($elm$json$Json$Decode$field, 'preview_url', $elm$json$Json$Decode$string), + A2($elm$json$Json$Decode$field, 'slug', $elm$json$Json$Decode$string), A2( $elm_community$json_extra$Json$Decode$Extra$andMap, - A2($elm$json$Json$Decode$field, 'csrf_token', $elm$json$Json$Decode$string), - $elm$json$Json$Decode$succeed( - A9($author$project$App$Model, $author$project$App$init_model.show_preview, $author$project$App$init_model.show_log, $author$project$App$init_model.editor_size, $author$project$App$init_model.content_changed, $author$project$App$init_model.log, $author$project$App$init_model.command_to_run, $author$project$App$init_model.selected_package, $author$project$App$init_model.jj_status, $author$project$App$init_model.commit_message))))))))))), + A2($elm$json$Json$Decode$field, 'preview_url', $elm$json$Json$Decode$string), + A2( + $elm_community$json_extra$Json$Decode$Extra$andMap, + A2($elm$json$Json$Decode$field, 'csrf_token', $elm$json$Json$Decode$string), + $elm$json$Json$Decode$succeed( + A9($author$project$App$Model, $author$project$App$init_model.show_preview, $author$project$App$init_model.show_log, $author$project$App$init_model.editor_size, $author$project$App$init_model.content_changed, $author$project$App$init_model.log, $author$project$App$init_model.command_to_run, $author$project$App$init_model.selected_package, $author$project$App$init_model.jj_status, $author$project$App$init_model.commit_message)))))))))))), $elm$core$Result$withDefault($author$project$App$init_model)); var $author$project$App$SetLog = function (a) { return {$: 'SetLog', a: a}; @@ -6447,8 +6660,8 @@ var $author$project$App$FileSaved = F2( function (a, b) { return {$: 'FileSaved', a: a, b: b}; }); -var $author$project$App$FileUploaded = function (a) { - return {$: 'FileUploaded', a: a}; +var $author$project$App$FilesUploaded = function (a) { + return {$: 'FilesUploaded', a: a}; }; var $author$project$App$HttpError = function (a) { return {$: 'HttpError', a: a}; @@ -6480,10 +6693,6 @@ var $author$project$App$SaveContent = function (a) { var $author$project$App$SetFileContent = function (a) { return {$: 'SetFileContent', a: a}; }; -var $author$project$App$UploadFile = F2( - function (a, b) { - return {$: 'UploadFile', a: a, b: b}; - }); var $elm$core$Platform$Cmd$batch = _Platform_batch; var $author$project$App$decode_command_response = $elm$json$Json$Decode$oneOf( _List_fromArray( @@ -6563,6 +6772,7 @@ var $author$project$App$fetch_jj_status = $elm$http$Http$get( A2($elm$json$Json$Decode$field, 'status', $elm$json$Json$Decode$string)), url: 'jj/status' }); +var $elm$http$Http$filePart = _Http_pair; var $elm$url$Url$Builder$toQueryPair = function (_v0) { var key = _v0.a; var value = _v0.b; @@ -6764,10 +6974,10 @@ var $author$project$App$update = F2( case 'DropFiles': var action = msg.a; var files = msg.b; - var _v3 = $elm$core$List$head(files); - if (_v3.$ === 'Just') { - var file = _v3.a; - if (action.$ === 'Content') { + if (action.$ === 'Content') { + var _v4 = $elm$core$List$head(files); + if (_v4.$ === 'Just') { + var file = _v4.a; return _Utils_Tuple2( model, A2( @@ -6775,51 +6985,47 @@ var $author$project$App$update = F2( $author$project$App$SetFileContent, $elm$file$File$toString(file))); } else { - return _Utils_Tuple2( - model, - A2( - $elm$core$Task$perform, - $author$project$App$UploadFile(file), - $elm$file$File$toString(file))); + return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); } } else { - return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); - } - case 'UploadFile': - var file = msg.a; - var contents = msg.b; - return _Utils_Tuple2( - model, - $elm$http$Http$post( - { - body: $elm$http$Http$multipartBody( - _List_fromArray( - [ + return _Utils_Tuple2( + model, + $elm$http$Http$post( + { + body: $elm$http$Http$multipartBody( + _Utils_ap( + _List_fromArray( + [ + A2($elm$http$Http$stringPart, 'csrfmiddlewaretoken', model.csrf_token) + ]), A2( - $elm$http$Http$stringPart, - 'path', - $elm$file$File$name(file)), - A2($elm$http$Http$stringPart, 'content', contents), - A2($elm$http$Http$stringPart, 'csrfmiddlewaretoken', model.csrf_token) - ])), - expect: $elm$http$Http$expectWhatever( - function (r) { - if (r.$ === 'Ok') { - return $author$project$App$FileUploaded(file); - } else { - return $author$project$App$NoOp; - } - }), - url: 'save-file' - })); - case 'FileUploaded': - var file = msg.a; - var name = $elm$file$File$name(file); - var url = $author$project$App$file_edit_url( - {is_dir: false, name: name, path: name}); - return _Utils_Tuple2( - model, - $elm$browser$Browser$Navigation$load(url)); + $elm$core$List$map, + $elm$http$Http$filePart('files'), + files))), + expect: $elm$http$Http$expectWhatever( + function (r) { + if (r.$ === 'Ok') { + return $author$project$App$FilesUploaded(files); + } else { + return $author$project$App$NoOp; + } + }), + url: 'upload-files' + })); + } + case 'FilesUploaded': + var files = msg.a; + if (files.b) { + var file = files.a; + var name = $elm$file$File$name(file); + var url = $author$project$App$file_edit_url( + {is_dir: false, name: name, path: name}); + return _Utils_Tuple2( + model, + $elm$browser$Browser$Navigation$load(url)); + } else { + return $author$project$App$nocmd(model); + } case 'SetCommand': var cmd = msg.a; return $author$project$App$nocmd( @@ -7184,12 +7390,14 @@ var $author$project$App$DropFiles = F2( function (a, b) { return {$: 'DropFiles', a: a, b: b}; }); +var $elm$html$Html$a = _VirtualDom_node('a'); var $elm$html$Html$Attributes$action = function (uri) { return A2( $elm$html$Html$Attributes$stringProperty, 'action', _VirtualDom_noJavaScriptUri(uri)); }; +var $elm$html$Html$audio = _VirtualDom_node('audio'); var $elm$file$File$decoder = _File_decoder; var $elm$html$Html$details = _VirtualDom_node('details'); var $elm$core$List$drop = F2( @@ -7247,6 +7455,13 @@ var $elm$core$Dict$fromList = function (assocs) { $elm$core$Dict$empty, assocs); }; +var $elm$html$Html$Attributes$href = function (url) { + return A2( + $elm$html$Html$Attributes$stringProperty, + 'href', + _VirtualDom_noJavaScriptUri(url)); +}; +var $elm$html$Html$img = _VirtualDom_node('img'); var $elm$html$Html$nav = _VirtualDom_node('nav'); var $elm$virtual_dom$VirtualDom$MayPreventDefault = function (a) { return {$: 'MayPreventDefault', a: a}; @@ -7260,16 +7475,14 @@ var $elm$html$Html$Events$preventDefaultOn = F2( }); var $elm$html$Html$section = _VirtualDom_node('section'); var $elm$html$Html$span = _VirtualDom_node('span'); +var $elm$html$Html$Attributes$src = function (url) { + return A2( + $elm$html$Html$Attributes$stringProperty, + 'src', + _VirtualDom_noJavaScriptOrHtmlUri(url)); +}; var $elm$html$Html$summary = _VirtualDom_node('summary'); -var $elm$core$Maybe$withDefault = F2( - function (_default, maybe) { - if (maybe.$ === 'Just') { - var value = maybe.a; - return value; - } else { - return _default; - } - }); +var $elm$html$Html$video = _VirtualDom_node('video'); var $author$project$App$editor_pane = function (model) { var languages = $elm$core$Dict$fromList( _List_fromArray( @@ -7281,6 +7494,7 @@ var $author$project$App$editor_pane = function (model) { _Utils_Tuple2('R', 'r'), _Utils_Tuple2('elm', 'elm') ])); + var file_path = 'file/' + model.file_path; var extension = A2( $elm$core$Maybe$withDefault, '', @@ -7448,57 +7662,111 @@ var $author$project$App$editor_pane = function (model) { $elm$html$Html$Attributes$method('POST'), $elm$html$Html$Attributes$action('save-file') ]), - _List_fromArray( - [ - A3( - $elm$html$Html$node, - 'code-editor', - _List_fromArray( - [ - A2( - $elm$html$Html$Events$on, - 'change', - A2( - $elm$json$Json$Decode$map, - $author$project$App$SetFileContent, + function () { + var _v0 = model.mime_type; + switch (_v0.$) { + case 'Text': + return _List_fromArray( + [ + A3( + $elm$html$Html$node, + 'code-editor', + _List_fromArray( + [ + A2( + $elm$html$Html$Events$on, + 'change', + A2( + $elm$json$Json$Decode$map, + $author$project$App$SetFileContent, + A2( + $elm$json$Json$Decode$at, + _List_fromArray( + ['target', 'value']), + $elm$json$Json$Decode$string))), + A2($elm$html$Html$Attributes$attribute, 'content', model.file_content), + A2($elm$html$Html$Attributes$attribute, 'language', language) + ]), + _List_fromArray( + [ + $elm$html$Html$text(model.file_content) + ])), A2( - $elm$json$Json$Decode$at, - _List_fromArray( - ['target', 'value']), - $elm$json$Json$Decode$string))), - A2($elm$html$Html$Attributes$attribute, 'content', model.file_content), - A2($elm$html$Html$Attributes$attribute, 'language', language) - ]), - _List_fromArray( - [ - $elm$html$Html$text(model.file_content) - ])), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$name('path'), - $elm$html$Html$Attributes$value(model.file_path), - $elm$html$Html$Attributes$type_('hidden') - ]), - _List_Nil), - A2( - $elm$html$Html$input, - _List_fromArray( - [ - $elm$html$Html$Attributes$name('content'), - $elm$html$Html$Attributes$value(model.file_content), - $elm$html$Html$Attributes$type_('hidden') - ]), - _List_Nil) - ])) + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$name('path'), + $elm$html$Html$Attributes$value(model.file_path), + $elm$html$Html$Attributes$type_('hidden') + ]), + _List_Nil), + A2( + $elm$html$Html$input, + _List_fromArray( + [ + $elm$html$Html$Attributes$name('content'), + $elm$html$Html$Attributes$value(model.file_content), + $elm$html$Html$Attributes$type_('hidden') + ]), + _List_Nil) + ]); + case 'Image': + return _List_fromArray( + [ + A2( + $elm$html$Html$img, + _List_fromArray( + [ + $elm$html$Html$Attributes$src(file_path) + ]), + _List_Nil) + ]); + case 'Audio': + return _List_fromArray( + [ + A2( + $elm$html$Html$audio, + _List_fromArray( + [ + $elm$html$Html$Attributes$src(file_path), + A2($elm$html$Html$Attributes$attribute, 'controls', '') + ]), + _List_Nil) + ]); + case 'Video': + return _List_fromArray( + [ + A2( + $elm$html$Html$video, + _List_fromArray( + [ + $elm$html$Html$Attributes$src(file_path), + A2($elm$html$Html$Attributes$attribute, 'controls', '') + ]), + _List_Nil) + ]); + default: + return _List_fromArray( + [ + A2( + $elm$html$Html$a, + _List_fromArray( + [ + $elm$html$Html$Attributes$href(file_path) + ]), + _List_fromArray( + [ + $elm$html$Html$text('Download') + ])) + ]); + } + }()) ])); }; var $elm$core$String$fromFloat = _String_fromNumber; var $author$project$App$SetEditorSize = function (a) { return {$: 'SetEditorSize', a: a}; }; -var $elm$html$Html$a = _VirtualDom_node('a'); var $elm$core$Basics$round = _Basics_round; var $author$project$App$as_percentage = function (amount) { return $elm$core$String$fromInt( @@ -7508,12 +7776,6 @@ var $elm$html$Html$datalist = _VirtualDom_node('datalist'); var $elm$json$Json$Decode$float = _Json_decodeFloat; var $elm$html$Html$h1 = _VirtualDom_node('h1'); var $elm$html$Html$header = _VirtualDom_node('header'); -var $elm$html$Html$Attributes$href = function (url) { - return A2( - $elm$html$Html$Attributes$stringProperty, - 'href', - _VirtualDom_noJavaScriptUri(url)); -}; var $author$project$App$link = F2( function (url, text) { return A2( @@ -7532,6 +7794,52 @@ var $elm$html$Html$Attributes$max = $elm$html$Html$Attributes$stringProperty('ma var $elm$html$Html$Attributes$min = $elm$html$Html$Attributes$stringProperty('min'); var $elm$html$Html$option = _VirtualDom_node('option'); var $elm$html$Html$output = _VirtualDom_node('output'); +var $elm$core$List$any = F2( + function (isOkay, list) { + any: + while (true) { + if (!list.b) { + return false; + } else { + var x = list.a; + var xs = list.b; + if (isOkay(x)) { + return true; + } else { + var $temp$isOkay = isOkay, + $temp$list = xs; + isOkay = $temp$isOkay; + list = $temp$list; + continue any; + } + } + } + }); +var $elm$core$List$member = F2( + function (x, xs) { + return A2( + $elm$core$List$any, + function (a) { + return _Utils_eq(a, x); + }, + xs); + }); +var $author$project$App$suffix = A2( + $elm$core$Basics$composeR, + $elm$core$String$split('.'), + A2( + $elm$core$Basics$composeR, + $elm$core$List$reverse, + A2( + $elm$core$Basics$composeR, + $elm$core$List$head, + $elm$core$Maybe$withDefault('')))); +var $author$project$App$preview_url = function (model) { + var page_suffixes = _List_fromArray( + ['html', 'php']); + var file_suffix = $author$project$App$suffix(model.file_path); + return A2($elm$core$List$member, file_suffix, page_suffixes) ? (model.preview_url + ('/' + model.file_path)) : model.preview_url; +}; var $elm$html$Html$Attributes$step = function (n) { return A2($elm$html$Html$Attributes$stringProperty, 'step', n); }; @@ -7563,7 +7871,8 @@ var $author$project$App$header = function (model) { _List_fromArray( [ $elm$html$Html$Attributes$target('preview'), - $elm$html$Html$Attributes$href(model.preview_url) + $elm$html$Html$Attributes$href( + $author$project$App$preview_url(model)) ]), _List_fromArray( [ @@ -7887,6 +8196,7 @@ var $author$project$App$SetCommand = function (a) { }; var $author$project$App$ShowCommitModal = {$: 'ShowCommitModal'}; var $author$project$App$Upload = {$: 'Upload'}; +var $elm$html$Html$Attributes$enctype = $elm$html$Html$Attributes$stringProperty('enctype'); var $elm$html$Html$li = _VirtualDom_node('li'); var $elm$core$Basics$not = _Basics_not; var $elm$html$Html$Events$onClick = function (msg) { @@ -8066,6 +8376,50 @@ var $author$project$App$main_nav = function (model) { $elm$html$Html$text('Run') ])) ])), + A3( + $author$project$App$form, + model, + _List_fromArray( + [ + $elm$html$Html$Attributes$method('POST'), + $elm$html$Html$Attributes$action('upload-files'), + $elm$html$Html$Attributes$enctype('multipart/form-data'), + A2( + $elm$html$Html$Events$stopPropagationOn, + 'drop', + $elm$json$Json$Decode$succeed( + _Utils_Tuple2($author$project$App$NoOp, true))), + A2( + $elm$html$Html$Events$stopPropagationOn, + 'dragover', + $elm$json$Json$Decode$succeed( + _Utils_Tuple2($author$project$App$NoOp, true))) + ]), + _List_fromArray( + [ + A2( + $elm$html$Html$input, + _List_fromArray( + [ + A2($elm$html$Html$Attributes$attribute, 'aria-labelledby', 'upload-files-button'), + $elm$html$Html$Attributes$type_('file'), + A2($elm$html$Html$Attributes$attribute, 'multiple', ''), + $elm$html$Html$Attributes$id('id_files'), + $elm$html$Html$Attributes$name('files') + ]), + _List_Nil), + A2( + $elm$html$Html$button, + _List_fromArray( + [ + $elm$html$Html$Attributes$id('upload-files-button'), + $elm$html$Html$Attributes$type_('submit') + ]), + _List_fromArray( + [ + $elm$html$Html$text('Upload') + ])) + ])), (A2($elm$core$String$right, 4, model.file_path) === '.elm') ? A3( $author$project$App$form, model, @@ -8167,12 +8521,6 @@ var $author$project$App$TogglePreview = function (a) { return {$: 'TogglePreview', a: a}; }; var $elm$html$Html$iframe = _VirtualDom_node('iframe'); -var $elm$html$Html$Attributes$src = function (url) { - return A2( - $elm$html$Html$Attributes$stringProperty, - 'src', - _VirtualDom_noJavaScriptOrHtmlUri(url)); -}; var $author$project$App$preview_pane = function (model) { return A2( $elm$html$Html$details, @@ -8210,7 +8558,8 @@ var $author$project$App$preview_pane = function (model) { _List_fromArray( [ $elm$html$Html$Attributes$id('preview-frame'), - $elm$html$Html$Attributes$src(model.preview_url) + $elm$html$Html$Attributes$src( + $author$project$App$preview_url(model)) ]), _List_Nil) ]) : _List_Nil));