public IView <HTMLElement> Create(RemoteFileDescr forFile, Action forceAddOrRemoveToView) { var widget = InputTypeButtonActionView.CreateFontAwesomeIconedAction( IconFontType.FontAwesomeSolid, FontAwesomeSolid.IconExchangeAlt); widget.Widget.Title = I18n.Translate("Replace"); widget.Triggered += () => { //HACK due to lack of: on input[file] activated but user declined to select anything _parent._hackOnUploadStarted = () => { widget.State = ActionViewState.CreateOperationRunning(); _activatedFor.Add(forFile); }; _parent.OnReplace(widget, forFile, forceAddOrRemoveToView); _parent._hackOnUploadEnded = result => { _activatedFor.Remove(forFile); widget.Widget.TextContent = FontAwesomeSolid.IconExchangeAlt; widget.State = result.Success ? ActionViewState.CreateIdleOrSuccess() : ActionViewState.CreateOperationFailed(new Exception(result.ErrorMessage)); UpdateEnablement(forFile, widget, false); //make action enabled (needed due to hack above) }; }; UpdateEnablement(forFile, widget, false); _known.Add(forFile, widget); return(widget); }
public IView <HTMLElement> Create(RemoteFileDescr forFile, Action forceAddOrRemoveToView) { var widget = InputTypeButtonActionView.CreateFontAwesomeIconedAction( IconFontType.FontAwesomeSolid, FontAwesomeSolid.IconTrashAlt); widget.Widget.Title = I18n.Translate("Remove"); widget.Triggered += async() => { widget.State = ActionViewState.CreateOperationRunning(); var result = await _parent.OnRemove(widget, forFile, forceAddOrRemoveToView); widget.Widget.TextContent = FontAwesomeSolid.IconTrashAlt; widget.State = result.Success ? ActionViewState.CreateIdleOrSuccess() : ActionViewState.CreateOperationFailed(new Exception(result.ErrorMessage)); }; UpdateEnablement(forFile, widget, false); _known.Add(forFile, widget); return(widget); }
private void UpdateContentImpl( RemoteFileDescr forFile, UploadStatus?formerStatus, AnchorBasedActionView widget, bool isOperationRunning) { var enabledVal = _parent.Downloadable && forFile.Status != UploadStatus.Running && forFile.FileId != null && !isOperationRunning; Logger.Debug(GetType(), "UpdateContentImpl file={0} formerStatus={1} isOperationRunning={2} enabled={3}", forFile, formerStatus, isOperationRunning, enabledVal); widget.Enabled = enabledVal; if (formerStatus.HasValue && formerStatus.Value == forFile.Status) { //no need to recreate details return; } switch (forFile.Status) { case UploadStatus.Running: { widget.State = ActionViewState.CreateOperationRunning(); var throbber = new HTMLDivElement { TextContent = FontAwesomeSolid.IconSpinner }; throbber.AddClasses(IconFontType.FontAwesomeSolid.ToCssClassName()); throbber.Style.FontSize = $"{_parent._cellSize.width/3}px"; throbber.Style.SetProperty("animation", "throbberSpin 1.0s linear infinite"); widget.Widget.AppendChild(throbber); break; } case UploadStatus.Failed: case UploadStatus.Succeeded: if (formerStatus.HasValue && formerStatus.Value == UploadStatus.Running) { //file just uploaded (succ or fail) SetupOnClick(forFile, widget, false); } if (forFile.UploadErrorMessage != null) { widget.Widget.SetAttribute( Magics.AttrDataErrorsTooltip, forFile.UploadErrorMessage); } if (forFile.ThumbDimensions != null) { var dim = _parent.CalculateDimensionsFittingIntoCell( forFile.ThumbDimensions.Value); var img = new HTMLImageElement { Width = dim.width, Height = dim.height, Src = forFile.ThumbnailDataUrl }; widget.Widget.AppendChild(img); } else { var icn = new HTMLDivElement { TextContent = FontAwesomeSolid.IconFileAlt }; icn.AddClasses(IconFontType.FontAwesomeSolid.ToCssClassName()); icn.Style.FontSize = $"{_parent._cellSize.width/3}px"; widget.Widget.AppendChild(icn); } break; default: throw new Exception("unsupported UploadStatus"); } }